Python Regex模式查找

2024-04-20 15:40:03 发布

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

下面的reg表达式

get_tags = lambda t: re.findall(r"<(.+)>", t)
st = "xyx<ab>xy x<bc> xyx<cd>xyxy xx<de> xyx <ef>x y<fg><gh>y"

print(get_tags(st))

预期输出为

^{pr2}$

即使模式不是贪婪的(没有使用“*”),表达式给出输出

['a>xyx<b>xyx<c>xyxyxx<d>xyx<e>xy<f><g']

模式中的问题是什么?在


Tags: lambdaregetab表达式tags模式cd
2条回答

默认情况下,.+是贪婪的。您需要在+旁边添加?不情愿的量词来进行非贪婪匹配。在

get_tags = lambda t: re.findall(r"<(.+?)>", t)

或者

^{pr2}$

[^<>]+对匹配任何字符但不属于>或{}的字符类进行一次或多次否定。在

>>> get_tags = lambda t: re.findall(r"<(.+?)>", t)
>>> st = "xyx<ab>xy x<bc> xyx<cd>xyxy xx<de> xyx <ef>x y<fg><gh>y"
>>> print(get_tags(st))
['ab', 'bc', 'cd', 'de', 'ef', 'fg', 'gh']
>>> get_tags = lambda t: re.findall(r"<([^<>]+)>", t)
>>> print(get_tags(st))
['ab', 'bc', 'cd', 'de', 'ef', 'fg', 'gh']

因为您知道只查找< >之间的字母,所以您还可以使用

get_tags = lambda t: re.findall(r"<(\w+)>", t)

作为正则表达式。这将只搜索[A-Za-z]之间的[A-Za-z],因为在您的示例中,括号之间有一些空格。这也会起作用。在

相关问题 更多 >