正则表达式匹配特定单词上方最接近的标签(HLS媒体播放列表)



给定HLS媒体播放列表如下:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:22.621+02:00
#EXTINF:6.666666667,
seg1.ts
#EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:29.637+02:00
#EXTINF:6.666666667,
seg2.ts
#EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:36.583+02:00
#EXTINF:6.666666666,
seg3.ts

我想创建一个正则表达式,以匹配最接近指定.ts文件名的EXT-X-PROGRAM-DATE-TIME标记后面的日期时间。例如,我希望能够通过指定匹配以seg2.ts结束来检索日期时间2022-09-12T10:03:29.637+02:00。即使将来在文件名和EXT-X-PROGRAM-DATE-TIME标记之间添加了新标记,它也应该可以工作。

这个模式(EXT-X-PROGRAM-DATE-TIME:(.*)[sS]*?seg2.ts(是我迄今为止所做的最大努力,但我不知道如何在最后一个可能的EXT-X-PROGRAM-DATE-TIME标签开始匹配。懒惰的量词于事无补。当前捕获的组是第一个EXT-X-PROGRAM-DATE-TIME之后的日期时间,即2022-09-12T10:03:22.621+02:00

我也研究过使用负前瞻,但我不知道如何将其与匹配seg2.ts之前的可变数量的字符和空白相结合。

我相信这个问题以前在另一个上下文中已经得到了回答,但我就是找不到合适的搜索词。

我们可以在这里使用re.search和regex回火点技巧:

#Python 2.7.17
import re
inp = """#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:22.621+02:00
#EXTINF:6.666666667,
seg1.ts
#EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:29.637+02:00
#EXTINF:6.666666667,
seg2.ts
#EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:36.583+02:00
#EXTINF:6.666666666,
seg3.ts"""
match = re.search(r'#EXT-X-PROGRAM-DATE-TIME:(S+)(?:(?!EXT-X-PROGRAM-DATE-TIME).)*bseg2.ts', inp, flags=re.S)
if match:
print(match.group(1))  # 2022-09-12T10:03:29.637+02:00

以下是正则表达式模式的解释:

  • #EXT-X-PROGRAM-DATE-TIME:
  • (S+)匹配并捕获时间戳
  • (?:(?!EXT-X-PROGRAM-DATE-TIME).)*在不跨越下一节的情况下匹配所有内容
  • bseg2.ts与文件名匹配如果匹配:

您可以编写不交叉以seg行开始的行的模式,然后匹配seg2.ts

^#EXT-X-PROGRAM-DATE-TIME:(.*)(?:n(?!segd+.ts$).*)*nseg2.ts$
  • ^字符串开始
  • #EXT-X-PROGRAM-DATE-TIME:按字面匹配
  • (.*)捕获组1,匹配行的其余部分(注意,这也可以匹配空字符串(
  • (?:n(?!segd+.ts$).*)*匹配所有不以seq模式开头的行
  • nseg2.ts匹配换行符和seq2.ts
  • $字符串结束

Regex演示

import re
pattern = r"^#EXT-X-PROGRAM-DATE-TIME:(.*)(?:n(?!segd+.ts$).*)*nseg2.ts$"
s = ("#EXTM3Un"
"#EXT-X-VERSION:3n"
"#EXT-X-ALLOW-CACHE:NOn"
"#EXT-X-TARGETDURATION:7n"
"#EXT-X-MEDIA-SEQUENCE:0nn"
"#EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:22.621+02:00n"
"#EXTINF:6.666666667,n"
"seg1.tsn"
"#EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:29.637+02:00n"
"#EXTINF:6.666666667,n"
"seg2.tsn"
"#EXT-X-PROGRAM-DATE-TIME:2022-09-12T10:03:36.583+02:00n"
"#EXTINF:6.666666666,n"
"seg3.ts")
m = re.search(pattern, s, re.M)
if m:
print(m.group(1))

输出

2022-09-12T10:03:29.637+02:00

如果您也不想在两者之间交叉匹配#EXT-X部件,您可以添加它作为负面前瞻的替代方案:

^#EXT-X-PROGRAM-DATE-TIME:(.*)(?:n(?!segd+.tsb|#EXT-X-PROGRAM-DATE-TIME:).*)*nseg2.ts$

最新更新