1

我有以下 URL 路径:

我希望捕捉不同的片段。包括 在内的所有.mp4内容都相当容易,但在以下子部分之后会变得很棘手:

media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=.abst/Seg1-Frag74

我希望捕捉到这一点,所以我有三场比赛:

  1. media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=
  2. .abst
  3. /Seg1-Frag74

这个想法是 #2 可以是不同的格式(它用于直播,所以我们有.f4mand .m3u8)和 #1 基本上是我只需要跳过的东西。#3 是可选的(并不总是存在),因此即使 #2 后面没有任何内容,它也必须匹配。

我尝试了以下方法:(.*?)(\.abst|\.f4m|\.m3u8)?(.*)

但结果如下(我使用的是 python,因此是None):

  1. ''(空字符串)
  2. 没有任何
  3. media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=.abst/Seg1-Frag74

如果我将其更改为以下(.*)(\.abst|\.f4m|\.m3u8)?(.*),我得到:

  1. media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=.abst/Seg1-Frag74
  2. 没有任何
  3. ''(空字符串)

第二部分是可选的,因为我们想要捕获意外的输入(并抛出错误以便我们进行调查),以防出现格式错误的请求或我们遗漏的东西(它不是预先指定的播放列表类型或类似类型之一)。

我愿意使用非正则表达式解决方案,我只是不确定如何解决这个问题。任何帮助表示赞赏。

4

2 回答 2

1

不要将第二组设为可选,也无需捕获第 1 组和第 3 组:

.*?(\.abst|\.f4m|\.m3u8).*?
于 2013-09-27T10:04:42.530 回答
1

您也许可以尝试类似...

r'(.*?)(\.[^/]+)(.*)'

[^/]+也将允许您获得不同的扩展名。如果您只想获得您提到的那些,只需使用(\.abst|\.f4m|\.m3u8)而不是(\.[^/]+)(不要放回?


您的?正则表达式中的 阻止了正确的匹配:

(.*?)(\.abst|\.f4m|\.m3u8)?(.*)

在这里,在字符串的开头,(.*?)将尝试不匹配任何内容,并且(\.abst|\.f4m|\.m3u8)?在同一点(即字符串的开头)也成功匹配(null)。

(.*)(\.abst|\.f4m|\.m3u8)?(.*)

在这里,(.*)是贪婪的,你最终在字符串的末尾并尝试(\.abst|\.f4m|\.m3u8)?再次匹配成功在那里有一个匹配(null)。

于 2013-09-27T10:05:24.627 回答