假设我有以下两种情况,我希望从字符串中找到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
模块?
答案 0 :(得分:1)
re.search("(?<=\>)([^ ]*)(?=[ $])", ">matchme").group(0)
这不起作用,因为在字符类$
中不再是特殊字符而是文字字符。 See this question.
需要在字符类中转义的唯一字符是:^ ] -
^
位于角色类的第一个位置时,才需要对其进行转义
]
需要进行转义,除非它位于第一个位置或^
之后立即(如果^
位于第一个位置。)
-
需要进行转义,除非它位于第一个位置,或者在^
之后或在课程结束时立即转义。
这将有效:
re.search("(?<=>)([^ ]*)(?= |$)", ">matchme").group(0)
注意:无需转义不特殊字符的>
。
答案 1 :(得分:0)
当你把它放在括号中时,$
是一个文字;在这种情况下,它不是一个元字符。因此,(?=[ $])
仅匹配最后一个单词(由上面的([^ ]*)
定义)后面跟一个空格或文字$
,这在您的示例文本中不正确。