我有以下网址路径:

我希望抓住不同的部分。包括.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/

10-10 17:46