空白的Python正则表达式问题

时间:2015-07-30 01:06:05

标签: python regex

我正在尝试做一个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)

但这不会创建单个匹配,更不用说具体到足以过滤音频/视频了。我的问题似乎归结为lineLabel之间的空格。我能想到的两种变化都失败了:

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')

1 个答案:

答案 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在其标记和属性中足够严格,那么正则表达式可以完成工作。它会变得更加混乱。