模式匹配问题

时间:2013-09-27 10:01:01

标签: python regex

我有以下网址路径:

我想捕捉不同的细分。包括.mp4在内的所有内容都非常简单,但在此之后使用以下子细分会变得棘手:

media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=.abst/Seg1-Frag74

我想抓住这个,所以我有三场比赛:

  1. media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=
  2. .abst
  3. /Seg1-Frag74
  4. 这个想法是#2可以是不同的格式(它用于直播,所以我们有.f4m.m3u8)而#1基本上是我需要跳过的东西。 #3是可选的(并不总是存在),因此即使#2没有任何内容,它也必须匹配。

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

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

    1. ''(空字符串)
    2. media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc = .abst / SEG1-Frag74
    3. 如果我将其更改为以下(.*)(\.abst|\.f4m|\.m3u8)?(.*),我会:

      1. media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc = .abst / SEG1-Frag74
      2. ''(空字符串)
      3. 第二部分是可选的,因为我们想要捕获意外的输入(并抛出错误,以便我们可以调查),以防发生格式错误的请求或我们错过的东西(它不是预先指定的播放列表类型之一或类似的)。

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

2 个答案:

答案 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)。