我对re模块感到困惑。
我有以下文字:
<grp>
<i>i1</i>
<i>i2</i>
<i>i3</i>
...
</grp>
我使用以下内容来提取文本的<i></i>
部分:
>>> t = "<grp> <i>i1</i> <i>i2</i> <i>i3</i> ... </grp>"
>>> import re
>>> re.match("<grp>.*(<i>.*?</i>).*</grp>", t).group(1)
'<i>i3</i>'
>>>
我只收到最后一个比赛项目。
我的问题是如何仅使用 reg表达式提取所有匹配项?例如:在列表<i>i1</i> <i>i2</i> <i>i3</i>
['<i>i1</i>', '<i>i2</i>', '<i>i3</i>']
非常感谢!
答案 0 :(得分:2)
您可以使用re.findall()
轻松完成此操作:
import re
result = re.findall("<i>.*?</i>", t)
>>> print result
['<i>i1</i>', '<i>i2</i>', '<i>i3</i>']
答案 1 :(得分:2)
为什么不使用XML解析器,例如Python标准库中的xml.etree.ElementTree
:
import xml.etree.ElementTree as ET
data = """
<grp>
<i>i1</i>
<i>i2</i>
<i>i3</i>
</grp>
"""
tree = ET.fromstring(data)
results = tree.findall('.//i')
print [ET.tostring(el).strip() for el in results]
print [el.text for el in results] # if you need just text inside the tags
打印:
['<i>i1</i>', '<i>i2</i>', '<i>i3</i>']
['i1', 'i2', 'i3']