我试图使用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的演示