模式匹配问题

2024-10-03 02:48:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下URL路径:

我想捕捉不同的片段。包括.mp4在内的所有内容都相当简单,但在这之后,使用以下子段会变得很棘手:

media_u11bgy04l_b282848_qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=.abst/Seg1-Frag74

我希望捕捉到这一点,因此我有三个匹配项:

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

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

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

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

  1. “”(空字符串)
  2. 没有
  3. 媒体\u u11bgy04l \u b282848 \u qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=.abst/Seg1-Frag74

如果我把它改成如下,(.*)(\.abst|\.f4m|\.m3u8)?(.*),我得到:

  1. 媒体\u u11bgy04l \u b282848 \u qdGltZT0xMzgwMjA0ODMzJnNlc3Npb249MjE2ODcxNzI3NTc=.abst/Seg1-Frag74
  2. 没有
  3. “”(空字符串)

第二部分是可选的,因为我们希望捕获意外的输入(并抛出一个错误以便进行调查),以防出现格式错误的请求或遗漏的内容(其中不是预先指定的播放列表类型或类似类型)。你知道吗

我对使用非正则表达式的解决方案持开放态度,我只是不确定如何解决这个问题。感谢您的帮助。你知道吗


Tags: 字符串类型内容格式错误media媒体m3u8
2条回答

你也许可以试试。。。你知道吗

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

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


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

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

这里,在字符串的开始处,(.*?)将尝试不匹配,并且(\.abst|\.f4m|\.m3u8)?也成功地在同一点(即在字符串的开始处)具有匹配(null)。你知道吗

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

在这里,(.*)是贪婪的,您将结束在字符串的末尾,并再次尝试匹配(\.abst|\.f4m|\.m3u8)?以获得匹配(null)。你知道吗

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

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

相关问题 更多 >