我正在尝试做一个python正则表达式,寻找格式化的行([edit:]没有新行;原来都在一行上):
<MediaLine Label="main-video" xmlns="ms-rtcp-metrics">
<OtherTags...></OtherTags>
</MediaLine>
我希望创建一个这个XML元素主体的捕获组(所以OtherTags...
)以便以后处理。
现在问题在于第一行,Label="main-video"
,我想不捕获Label="main-audio"
我的初步解决方案是这样的:
m = re.search(r'<MediaLine(.*?)</MediaLine>', line)
这是有效的,因为它会过滤掉所有其他非MediaLine
元素,但不考虑视频与音频。所以为了建立它,我尝试简单地添加
m = re.search(r'<MediaLine Label(.*?)</MediaLine>', line)
但这不会创建单个匹配,更不用说具体到足以过滤音频/视频了。我的问题似乎归结为line
和Label
之间的空格。我能想到的两种变化都失败了:
m = re.search(r'<MediaLine L(.*?)</MediaLine>', line)
m = re.search(r'<MediaLine\sL(.*?)</MediaLine>', line)
然而,以下工作,无法区分音频/视频:
m = re.search(r'<MediaLine\s(.*?)</MediaLine>', line)
为什么'L'是失败的原因?我哪里错了?谢谢你的帮助。
为了先发制人,我的目标是这样的表达:
m = re.search("<MediaLine Label=\"main-video\"(?:.*?)>(?P<payload>.*?)</MediaLine>", line)
result = m.group('payload')
答案 0 :(得分:1)
默认情况下,.
与换行符不匹配,因此您的初始解决方案也不起作用。要使.
与换行符匹配,您需要使用re.DOTALL
标记(又名re.S
):
>>> m = re.search("<MediaLine Label=\"main-video\"(?:.*?)>(?P<payload>.*)</MediaLine>", line, re.DOTALL)
>>> m.group('payload')
'\n <OtherTags...></OtherTags>\n'
请注意,第一组中还有一个额外的?
,因此它并不贪心。
正如另一篇评论所述,解析XML的最佳方法是XML解析器。但是,如果您的特定XML在其标记和属性中足够严格,那么正则表达式可以完成工作。它会变得更加混乱。