python re模块组,如何提取所有匹配组?

时间:2014-07-02 02:46:27

标签: python xml regex

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

非常感谢!

2 个答案:

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