编译用户定义的regex对象并在Python中进行搜索/匹配

时间:2018-11-18 20:09:21

标签: python regex

我正在编写一个在线正则表达式检查器,该检查器以模式和标志的形式接收来自用户的输入,并使用其来编译正则表达式对象。然后使用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的重复,因为该问题与正则表达式无关。

2 个答案:

答案 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.escapematchsearch应该再次作为用户输入。