Python正则表达式-为什么字符串结尾($和\Z)不适用于组表达式?

Python正则表达式-为什么字符串结尾($和\Z)不适用于组表达式?,python,regex,Python,Regex,在Python2.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(pat

在Python2.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
为什么它是这样工作的?如何运行?

表达式是一个字符组,意味着它将匹配其中包含的任何一个字符。因此,您将匹配一个文本$字符。字符组始终应用于一个输入字符,因此不能包含锚定

如果要匹配空白字符或字符串结尾,请使用非捕获组,并结合|或选择器:

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

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

方括号不表示组,它们表示一个字符集,该字符集与括号中的任何一个字符匹配,如下所示:,特殊字符在集合中失去其特殊意义,除非在类中如\s中另有指示


如果要匹配\s或字符串结尾,请使用类似于\s |$的内容。

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

r"\w+(\s|$)"
你会得到:

>>> re.findall("\w+(\s|$)", "green pears")
[' ', '']
这是因为re.findall返回捕获的组\s |$值

:字符组和捕获的组。要禁用捕获的组但仍作为角色组,请使用?:。。。语法:


所以$effective不起作用-您的预期输出是什么?@RohitJain['green','pears']来自'\w+\s'加'\w+$'。@EMS:那是因为:在我的表达式中是一个输入错误;更正…因为我的打字错误,很抱歉。我想你指的是一个非捕获组。这东西已经够让人迷惑的了;让我们至少试着正确使用术语。@Alanmore:是的,我的意思是不捕获。更正,谢谢!
>>> re.findall("\w+(?:\s|$)", "green pears")
['green ', 'pears']