给定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$