Python不匹配正则表达式

时间:2013-02-26 19:46:43

标签: python regex

>>> 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的输出。为什么它没有返回适当的正则表达式对象?我的模式有什么问题吗?

2 个答案:

答案 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'(.*)\\(.*)\\(.*)'