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

2024-10-03 15:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有以下两种情况,我想从字符串中找到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模块特有的吗?你知道吗


Tags: 字符串remostsearch表达式groupnot情况
2条回答
re.search("(?<=\>)([^ ]*)(?=[ $])", ">matchme").group(0)

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

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

^仅当它位于字符类的第一个位置时才需要转义。
]需要转义,除非它在第一个位置或在^之后立即转义(如果^在第一个位置)。
-需要转义,除非它位于第一个位置或紧跟在^之后或在类的末尾。你知道吗

这将起作用:

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

注意:不需要转义>,这不是一个特殊字符。你知道吗

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

相关问题 更多 >