regex 我得到一个TypeError:第一个参数必须是字符串或编译对象,当我非常确定我的re的第一个对象,潜艇

oiopk7p5  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(119)

我目前正在编写一个程序来修改机器人的偏移值,这些值以文本形式存储在程序中。我已经设法完成了大部分功能,但我在最后一个功能上遇到了问题。是雷。sub方法。我一直得到一个错误说:
raise TypeError(“第一个参数必须是字符串或编译模式”)TypeError:第一个参数必须是字符串或编译模式。
然而,对我来说,第一个参数似乎是一个编译模式。如果有人有什么建议的话,我需要一些帮助来解决这个问题。这里是有问题的部分。submit_x_offset函数而且似乎删除了整个文件,同样的regex语句在find_x_offset中工作得很好,因为它目前没有编译。

import os
import tkinter as tk
from tkinter import *
from tkinter import ttk
from tkinter import filedialog
import re

class Controller(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.grid(row=0, column=0, columnspan=6, sticky=W)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (ChooseFile, GusToPlateRight, GusToPlateLeft):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky=NSEW)

        self.show_frame(ChooseFile)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class ChooseFile(tk.Frame):

    def open_file(self):
        global filename

        file.delete('1.0', END)

        userentry_fname.delete('0', END)

        f_types = [("FLW Programs", "*.ls"), ("Text Files ", "*.txt")]

        filename = filedialog.askopenfilename(filetypes=f_types)

        userentry_fname.insert(END, filename)

        my_file = open(filename).read()

        file.insert(END, my_file)

    def clear_file(self):
        file.delete('1.0', END)
        userentry_fname.delete('0', END)

    def find_x_offsets(self, xoffset_match):
        # global matches

        xoffset_match.delete('1.0', END)
        with open(filename, 'r') as text:
            string = text.read()
            matches = re.search(
                r'!GUSSET TO BACKPLATE RIGHT GUS 1.*PR\[GP1:2,1:OFFSET\]=([^; ]*)(?!ENDFOR).*ENDFOR.*', string,
                re.M | re.DOTALL)
            print(matches.group(1))

            xoffset_match.insert(END, matches.group(1))

    def submit_x_offsets(self, set_xoffset):
        text_to_replace = set_xoffset.get()
        offset_to_change = re.compile(
            r'!GUSSET TO BACKPLATE RIGHT GUS 1.*PR\[GP1:2,1:OFFSET\]=([^; ]*)(?!ENDFOR).*ENDFOR.*', re.M | re.S).groups

        with open(filename, 'r') as text:
            string = text.read()
        with open(filename, 'w') as file:
            string = re.sub(offset_to_change, text_to_replace, string)
            file.write(string.group(1))
vpfxa7rd

vpfxa7rd1#

我想我解释错了。我想从find_x_offset中搜索的同一行中删除。我需要用另一个号码替换一个号码。搜索功能我做得很好。没有问题。我需要一个子或替换函数

w46czmvw

w46czmvw2#

问题不在于正则表达式模式的第一部分,而在于整个正则表达式模式。换句话说,模式中有一个错误,它以一种相当无用的方式告诉你。
消息-“第一个参数必须是字符串或编译对象”指的是re函数的第一个参数,即你输入的字符串或对象。
您提供的内容可能不是字符串或编译对象。但也有可能模式中实际上存在错误,例如捕获组上缺少括号。

相关问题