python中的正则表达式re.findall()

时间:2014-11-12 20:55:41

标签: regex python-3.x

我尝试了以下内容:

我想用re.findall()

拆分
str="<abc>somechars<*><def>somechars<*><ghj>somechars<*><ijk>somechars<*>"
print(re.findall('<(abc|ghj)>.*?<*>',str))

out应该是

['<abc>somechars<*>','<ghj>somechars<*>']

在记事本中,如果我尝试这个表达式,我说得对,但在这里:

['abc', 'ghj']

有什么想法吗? 谢谢你的回答。

3 个答案:

答案 0 :(得分:3)

(<(?:abc|ghj)>.*?<\*>)

试试这个。看看演示。

http://regex101.com/r/kP8uF5/12

import re
p = re.compile(ur'(<(?:abc|ghj)>.*?<\*>)', re.IGNORECASE | re.MULTILINE)
test_str = u"<abc>somechars<*><def>somechars<*><ghj>somechars<*><ijk>somechars<*>"

re.findall(p, test_str)

答案 1 :(得分:1)

您正在捕捉(abc|ghj)。请改为使用非捕获组(?:abc|ghj)

另外,你应该逃避正则表达式中的第二个*因为你想要一个文字星号:<\*>而不是<*>

>>> s = '<abc>somechars<*><def>somechars<*><ghj>somechars<*><ijk>somechars<*>'
>>> re.findall(r'<(?:abc|ghj)>.*?<\*>', s)
['<abc>somechars<*>', '<ghj>somechars<*>']

另外,请避免遮蔽内置名称str

答案 2 :(得分:0)

只需将该群组设为非捕获群组:

str="<abc>somechars<*><def>somechars<*><ghj>somechars<*><ijk>somechars<*>"
print(re.findall('<(?:abc|ghj)>.*?<*>',str))

该函数从左到右返回组,并且由于您指定了一个组,因此省略了整个匹配。

来自Python documentation

  

返回字符串中所有非重叠的模式匹配,作为列表   字符串。从左到右扫描字符串,并返回匹配项   按顺序找到。如果模式中存在一个或多个组,   返回一个组列表;如果模式,这将是一个元组列表   有不止一个团体。结果中包含空匹配   除非他们触及另一场比赛的开始