15

在 Python 2.6 中。似乎字符串结尾的标记$\Z组表达式不兼容。例子

import re
re.findall("\w+[\s$]", "green pears")

返回

['green ']

(所以$有效地不起作用)。并使用

re.findall("\w+[\s\Z]", "green pears")

导致错误:

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in findall(pattern, string, flags)
    175 
    176     Empty matches are included in the result."""
--> 177     return _compile(pattern, flags).findall(string)
    178 
    179 if sys.hexversion >= 0x02020000:

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc in _compile(*key)
    243         p = sre_compile.compile(pattern, flags)
    244     except error, v:
--> 245         raise error, v # invalid expression
    246     if len(_cache) >= _MAXCACHE:
    247         _cache.clear()

error: internal: unsupported set operator

为什么它会这样工作以及如何解决?

4

3 回答 3

35

[..]表达式是一个字符,这意味着它将匹配其中包含的任何一个字符。因此,您匹配的是文字$字符。字符组始终适用于一个输入字符,因此永远不能包含锚点。

如果您想匹配空白字符字符串的结尾,请改用非捕获组,并结合|or 选择器:

r"\w+(?:\s|$)"

或者,查看\b单词边界锚。它将匹配\w组开始或结束的任何位置(因此它锚定到文本中\w字符前面或后面有\W字符的点,或者位于字符串的开头或结尾)。

于 2012-10-06T20:27:52.423 回答
3

方括号不表示一个组,它们表示一个字符集,它匹配一个字符(括号中的任何一个字符)如记录的那样,“特殊字符在集合内失去其特殊含义”(除非另有说明,如类\s)。

如果要匹配\s或结束字符串,请使用类似\s|$.

于 2012-10-06T20:30:15.237 回答
1

Martijn Pieters 的回答是正确的。详细说明一下,如果您使用捕获组

r"\w+(\s|$)"

你得到:

>>> re.findall("\w+(\s|$)", "green pears")
[' ', '']

那是因为re.findall()返回捕获的组(\s|$)值。

括号()用于两个目的:字符组和捕获组。要禁用捕获的组但仍充当字符组,请使用(?:...)语法:

>>> re.findall("\w+(?:\s|$)", "green pears")
['green ', 'pears']
于 2017-05-09T17:20:42.673 回答