Python regex多行正确定义



我试图使用re.VERBOSE在几行中定义一个正则表达式,但python正在添加换行符号。如

当不使用multiline

In [1]: pat = re.compile(r'''(?P<host>(d{1,3}.){3}d{1,3})( - )(?P<user_name>(w+|-)).''')
...: pat 
re.compile(r'(?P<host>(d{1,3}.){3}d{1,3})( - )(?P<user_name>(w+|-)).',re.UNICODE)

但是当尝试定义为multiline

In [2]: pat = re.compile(r''' 
...: (?P<host>(d{1,3}.){3}d{1,3}) 
...: ( - )(?P<user_name>(w+|-)).''', re.MULTILINE|re.VERBOSE)    
In [4]: pat
re.compile(r'\n(?P<host>(d{1,3}.){3}d{1,3})\n( - )(?P<user_name>(w+|-)).',
re.MULTILINE|re.UNICODE|re.VERBOSE)

我一直得到一个n,其中regex的下一部分是定义的,但它不应该。

我该如何定义一个多行正则表达式?

当您使用re.VERBOSE标志时,在regex中使用换行符没有固有的问题,因为空白被忽略,有一个重要的警告:

模式中的空白将被忽略,除非是在字符中类,或,如果前面有未转义的反斜杠

您的第一个问题是,您在正则表达式中的每一行的末尾添加了一个不必要的,然后它们出现在正则表达式中,使换行符前面有一个未转义的反斜杠,因此需要匹配。考虑这个简单的例子:

pat = re.compile(r'''
d+
-
d+''', re.VERBOSE)
pat
# re.compile('n\d+n-n\d+', re.VERBOSE) - note newlines in the regex
pat.match('24-34')
# <re.Match object; span=(0, 5), match='24-34'> - but it still matches fine
pat = re.compile(r'''
d+
-
d+''', re.VERBOSE)
pat
# re.compile('\n\d+\n-\n\d+', re.VERBOSE)
pat.match('24-34')
# nothing
pat.match('n24n-n34')
# <re.Match object; span=(0, 8), match='n24n-n34'> - newlines required to be matched

您的另一个问题是您的正则表达式试图匹配此捕获组中的空白:

( - )

当设置了re.VERBOSE标志时,要匹配空白,必须遵循规则并转义它或将其放入字符类中。例如:

pat = re.compile(r'( - )', re.VERBOSE)
pat.match(' - ')
# nothing - the spaces in the regex are ignored
pat.match('-')
# <re.Match object; span=(0, 1), match='-'>  - matches just the `-`
pat = re.compile(r'( -[ ])', re.VERBOSE)  # important whitespace treated appropriately
pat.match(' - ')
# <re.Match object; span=(0, 3), match=' - '>  - matches the string because whitespace rules followed

regex101的演示

相关内容

  • 没有找到相关文章

最新更新