我有以下网址路径:
我想捕捉不同的细分。包括.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
):
如果我将其更改为以下(.*)(\.abst|\.f4m|\.m3u8)?(.*)
,我会:
第二部分是可选的,因为我们想要捕获意外的输入(并抛出错误,以便我们可以调查),以防发生格式错误的请求或我们错过的东西(它不是预先指定的播放列表类型之一或类似的)。
我愿意使用非正则表达式解决方案,我只是不确定如何解决这个问题。任何帮助表示赞赏。
答案 0 :(得分:1)
不要使第二组成为可选项,并且不需要捕获第1组和第3组:
.*?(\.abst|\.f4m|\.m3u8).*?
答案 1 :(得分:1)
您可以尝试类似......
r'(.*?)(\.[^/]+)(.*)'
[^/]+
也可以让您获得不同的扩展程序。如果您只想获得您提到的内容,请使用(\.abst|\.f4m|\.m3u8)
代替(\.[^/]+)
(不要放回?
)
正则表达式中的?
阻止了正确匹配:
(.*?)(\.abst|\.f4m|\.m3u8)?(.*)
这里,在字符串的开头,(.*?)
将尝试匹配none,(\.abst|\.f4m|\.m3u8)?
也成功在同一点(即字符串的开头)匹配(null)
(.*)(\.abst|\.f4m|\.m3u8)?(.*)
在这里,(.*)
是贪婪的,你最终在字符串的末尾,并尝试再次匹配(\.abst|\.f4m|\.m3u8)?
成功匹配(null)。