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

4

2 回答 2

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')
于 2013-02-26T19:48:44.987 回答
1

问题是您试图在原始字符串中转义反斜杠。从Python 文档中,

当存在 'r' 或 'R' 前缀时,反斜杠后面的字符将不加更改地包含在字符串中,并且所有反斜杠都保留在字符串中。

这意味着所有 8 个反斜杠都保留在您的正则表达式中,并且每一对都匹配测试字符串中的一个反斜杠。当您将其可视化时(将滑块拖动到测试字符串上方),问题就会立即显现出来。可以通过将您的正则表达式替换为

r'(.*)\\(.*)\\(.*)'
于 2013-02-27T05:08:08.410 回答