我有以下网址路径:
我希望抓住不同的部分。包括.mp4
在内的所有内容都很容易,但是在此之后,使用以下子段会很棘手:media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=.abst/Seg1-Frag74
我希望捕捉到这一点,所以我有三场比赛:media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=
.abst
/Seg1-Frag74
这个想法是#2可以是不同的格式(用于实时流传输,因此我们有.f4m
和.m3u8
),而#1基本上是我只需要跳过的东西。 #3是可选的(并非始终存在),因此即使没有任何内容跟随#2,它也必须匹配。
我尝试了以下方法:(.*?)(\.abst|\.f4m|\.m3u8)?(.*)
但是结果如下(我使用的是python,因此是None
):
''(空字符串)
没有
media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc = .abst / Seg1-Frag74
如果将其更改为以下(.*)(\.abst|\.f4m|\.m3u8)?(.*)
,则会得到:
media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc = .abst / Seg1-Frag74
没有
''(空字符串)
第二部分是可选的,因为我们希望在格式错误的请求或我们错过的内容(不是预先指定的播放列表类型之一或类似类型)的情况下捕获意外输入(并抛出错误以便我们进行调查)。
我愿意使用非正则表达式解决方案,但我不确定该如何解决。任何帮助表示赞赏。
最佳答案
您也许可以尝试类似...
r'(.*?)(\.[^/]+)(.*)'
[^/]+
还将允许您获得不同的扩展名。如果只想得到您提到的内容,请使用(\.abst|\.f4m|\.m3u8)
而不是(\.[^/]+)
(不要放回?
)正则表达式中的
?
阻止了正确的匹配:(.*?)(\.abst|\.f4m|\.m3u8)?(.*)
在这里,在字符串的开头,
(.*?)
将尝试不匹配任何内容,并且(\.abst|\.f4m|\.m3u8)?
在同一点(即字符串的开头)也成功具有匹配项(null)。(.*)(\.abst|\.f4m|\.m3u8)?(.*)
在这里,
(.*)
是贪婪的,您结束于字符串的末尾,然后再次尝试匹配(\.abst|\.f4m|\.m3u8)?
会成功在此匹配(空)。关于python - 模式匹配问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19047990/