我正在尝试使用正则表达式解析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>
我用multiline
和dotall
尝试了此正则表达式:
>>> re.findall(r'script\s+type=\"(\w+)\".*alias=\"catch\"\s+value=\"(\d+)\"', a, re.MULTILINE|re.DOTALL)
我得到的输出是:
[('abc', '8')]
预期输出为:
[('abc', '4'), ('xyz', '8')]
有人可以帮我弄清楚我在这里想念的东西吗?
答案 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')]