带Whitesp的Python正则表达式问题

2024-10-01 02:19:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: re元素search视频mainvideoline音频
1条回答
网友
1楼 · 发布于 2024-10-01 02:19:00

默认情况下,.与换行符不匹配,因此初始解决方案也不起作用。要使.与换行符匹配,需要使用^{}标志(又称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在标记和属性方面足够严格,那么正则表达式就可以完成这项工作。只会更混乱。你知道吗

相关问题 更多 >