Python正则表达式模式findall

时间:2014-12-05 11:22:12

标签: python regex greedy findall

下面的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))

预期产量

['ab', 'bc', 'cd', 'de', 'ef', 'fg', 'gh']

即使模式不贪婪(没有&#39; *&#39;使用?),表达式给出了输出

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

模式中的问题是什么?

2 个答案:

答案 0 :(得分:2)

默认情况下,

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

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

OR

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

[^<>]+否定了与任何字符匹配但不符合><一次或多次的字符类。

>>> 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']

答案 1 :(得分:0)

由于您知道只能找到< >之间的字母,所以您也可以使用

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

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