使用Python正则表达式解析XML文件中的多个相似字段值

时间:2018-10-03 18:26:09

标签: python regex python-2.7

我正在尝试使用正则表达式解析xml文件。 无论哪个脚本标记具有“ catch”别名,我都需要收集“ type”和“ value”。

<script type="abc">
    <line x="word" size="1" alias="catch" value="4" desc="description"/>
</script>
<script type="xyz">
    <line x="state" size="5" alias="catch" value="8" desc="description"/>
</script>

我用multilinedotall尝试了此正则表达式:

>>> re.findall(r'script\s+type=\"(\w+)\".*alias=\"catch\"\s+value=\"(\d+)\"', a, re.MULTILINE|re.DOTALL)

我得到的输出是:

[('abc', '8')]

预期输出为:

[('abc', '4'), ('xyz', '8')]

有人可以帮我弄清楚我在这里想念的东西吗?

2 个答案:

答案 0 :(得分:1)

我建议使用BeautifulSoup。您可以解析标签,并通过少量的数据重组来轻松检查正确的alias值并存储感兴趣的相关属性。像这样:

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, "lxml")

to_keep = []
for script in soup.find_all("script"):
    t = script["type"]
    attrs = {
        k:v for k, v in [attr.split("=") 
                         for attr in script.contents[0].split() 
                         if "=" in attr]
    }
    if attrs["alias"] == '"catch"':
        to_keep.append({"type": t, "value": attrs["value"]})

to_keep
# [{'type': 'abc', 'value': '"4"'}, {'type': 'xyz', 'value': '"8"'}]

数据:

data = """<script type="abc">
    <line x="word" size="1" alias="catch" value="4" desc="description"/>
</script>
<script type="xyz">
    <line x="state" size="5" alias="catch" value="8" desc="description"/>
</script>"""

答案 1 :(得分:0)

找到了答案。感谢downvoter。我认为没有必要否决这个问题。

>>> re.findall(r'script\s+type=\"(\w+)\".*?alias=\"catch\"\s+value=\"(\d+)\".*?\<\/script\>', a, re.MULTILINE|re.DOTALL)
[('abc', '4'), ('xyz', '8')]