我尝试了以下内容:
我想用re.findall()
拆分str="<abc>somechars<*><def>somechars<*><ghj>somechars<*><ijk>somechars<*>"
print(re.findall('<(abc|ghj)>.*?<*>',str))
out应该是
['<abc>somechars<*>','<ghj>somechars<*>']
在记事本中,如果我尝试这个表达式,我说得对,但在这里:
['abc', 'ghj']
有什么想法吗? 谢谢你的回答。
答案 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))
该函数从左到右返回组,并且由于您指定了一个组,因此省略了整个匹配。
返回字符串中所有非重叠的模式匹配,作为列表 字符串。从左到右扫描字符串,并返回匹配项 按顺序找到。如果模式中存在一个或多个组, 返回一个组列表;如果模式,这将是一个元组列表 有不止一个团体。结果中包含空匹配 除非他们触及另一场比赛的开始