我正在编写一个在线正则表达式检查器,该检查器以模式和标志的形式接收来自用户的输入,并使用其来编译正则表达式对象。然后使用regex对象检查测试字符串是否在regex模式提供的格式内匹配。到目前为止,编译功能如下:
class RegexObject:
...
def compile(self):
flags = ''
if self.multiline_flag:
flags = re.M
if self.dotall_flag:
flags |= re.S
if self.verbose_flag:
flags |= re.X
if self.ignorecase_flag:
flags |= re.I
if self.unicode_flag:
flags |= re.U
regex = re.compile(self.pattern, flags)
return regex
请注意,self.pattern
和所有标志都是用户使用简单形式定义的类属性。但是,我在文档中注意到的一件事是,通常在编译函数中的模式之前有一个r
,如下所示:
re.compile(r'(?<=abc)def')
如何将r
放在变量名之前的代码中?另外,如果我想告诉用户测试输入是否有效,我应该使用match
方法还是search
方法?
感谢您的帮助。
编辑:该问题不是this one的重复,因为该问题与正则表达式无关。
答案 0 :(得分:1)
不用担心r
,这里不需要。
r
代表“原始”,而不是“正则表达式”。在r字符串中,可以放置反斜杠而不将其转义。 R字符串经常用在正则表达式中,因为正则表达式中经常有许多反斜杠。转义反斜杠可能很烦人。看到这个shell输出:
>>> s = r"\a"
>>> s2 = "\a"
>>> s2
'\x07'
>>> s
'\\a'
您应该使用search
,因为match
只看字符串的开头。查看docs。
re.search(pattern, string, flags=0)
扫描字符串以查找 正则表达式模式产生第一个位置的位置 匹配,并返回相应的匹配对象。如果否则不返回 字符串中的位置与模式匹配;请注意,这是 与在 字符串。
re.match(pattern, string, flags=0)
如果零个或多个字符 字符串的开头匹配正则表达式模式,返回一个 对应的匹配对象。如果字符串不匹配,则返回None 模式;请注意,这与零长度匹配不同。
请注意,即使在MULTILINE模式下,re.match()也只会在 字符串的开头而不是每一行的开头。
如果要在字符串中的任意位置找到匹配项,请改用search() (另请参阅search()与match())。
答案 1 :(得分:0)
您不必使用r
。相反,您应该使用re.escape
。match
或search
应该再次作为用户输入。