正则表达式:匹配单个字符与括号或选择,为什么括号失败?

时间:2014-02-24 20:52:18

标签: python regex string

假设我有以下两种情况,我希望从字符串中找到matchme

'>matchme but not this stuff'
'>matchme'

我无法理解正则表达式中元字符的工作原理。

>>> re.search("(?<=\>)([^ ]*)(?= |$)", ">matchme but not this stuff").group(0)
'matchme'
>>> re.search("(?<=\>)([^ ]*)(?= |$)", ">matchme").group(0)
'matchme'

我理解这一点,但为什么会失败:

>>> re.search("(?<=\>)([^ ]*)(?=[ $])", ">matchme").group(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

我能想到的是,在括号表达式中,所有元字符都被视为字符。我的印象是只有-是唯一被视为括号内文字的元字符(在特定情况下授予)。

除非已定义特定元案例(即^-),否则所有元字符都被视为括号表达式中的文字,或者这是否特定于python的re模块?

2 个答案:

答案 0 :(得分:1)

re.search("(?<=\>)([^ ]*)(?=[ $])", ">matchme").group(0)

这不起作用,因为在字符类$中不再是特殊字符而是文字字符。 See this question.

需要在字符类中转义的唯一字符是:^ ] -

仅当

^位于角色类的第一个位置时,才需要对其进行转义 ]需要进行转义,除非它位于第一个位置或^ 之后立即(如果^位于第一个位置。)
-需要进行转义,除非它位于第一个位置,或者在^之后或在课程结束时立即转义。

这将有效:

re.search("(?<=>)([^ ]*)(?= |$)", ">matchme").group(0)

注意:无需转义特殊字符的>

答案 1 :(得分:0)

当你把它放在括号中时,$是一个文字;在这种情况下,它不是一个元字符。因此,(?=[ $])仅匹配最后一个单词(由上面的([^ ]*)定义)后面跟一个空格或文字$,这在您的示例文本中不正确。