>>> pattern = re.compile(r'(.*)\\\\(.*)\\\\(.*)')
>>> m = re.match(pattern, 'string1\string2\string3')
>>> m
>>>
>>> m.groups
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
我正在尝试在上面的正则表达式中使用以下格式匹配字符串:string1\string2\string3
。
以上是Python的输出。为什么它没有返回适当的正则表达式对象?我的模式有什么问题吗?
答案 0 :(得分:1)
问题在于,在你的模式中,你使用\\\\
代表两个原始反斜杠,而在要匹配的文本中,你使用\s
,实际上根本没有反斜杠(它是一个\s
个字符。)
首先,您可能希望将文本设为原始字符串,否则Python会将其作为\s
字符读取。
re.match(pattern, r'string1\string2\string3')
其次,在模式中只需要两个连续斜杠,以表示一个反斜杠:
pattern = re.compile(r'(.*)\\(.*)\\(.*)')
最后,您要m.groups
而不是m.groups()
(调用方法)。因此,您的代码总体如下:
pattern = re.compile(r'(.*)\\(.*)\\(.*)')
m = re.match(pattern, r'string1\string2\string3')
m.groups()
# ('string1', 'string2', 'string3')
答案 1 :(得分:1)
问题是你试图逃避原始字符串中的反斜杠。来自Python docs,
当存在'r'或'R'前缀时,字符串中包含反斜杠后面的字符不做更改,并且所有反斜杠都保留在字符串中。
这意味着所有8个反斜杠都保留在正则表达式中,并且每对反射匹配测试字符串中的单个反斜杠。问题立即显现when you visualize it(将滑块拖动到测试字符串上方)。可以通过用
替换正则表达式来修复它r'(.*)\\(.*)\\(.*)'