python - 在 Python 中使用正则表达式提取多个匹配项

标签 python regex python-2.7

我是正则表达式的新手,似乎无法弄清楚如何从字符串 s 如下所示。

关于如何改进正则表达式的任何建议?

s = '#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:17\n#EXT-X-MEDIA-SEQUENCE:1\n#EXTINF:16.667,\nmedia_1.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_2.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_3.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_4.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_5.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_6.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_7.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_8.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_9.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_10.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_11.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_12.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_13.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_14.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_15.ts?wowzasessionid=184420502'
pattern = re.compile('nmedia_(.*?).ts', re.IGNORECASE)
match = pattern.findall(s)
match

最佳答案

我建议您的正则表达式语句尽可能明确。所以我建议的改进是 \d+ 来匹配一个或多个数字而不是 .*,零个或多个任何东西。

由于您是正则表达式的新手,您可能会对使用 verbose 标志感兴趣。 (它也非常适合文档。)这是一个代码示例:

# -*- coding: utf-8 -*-
import re

s = r'#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:17\n#EXT-X-MEDIA-SEQUENCE:1\n#EXTINF:16.667,\nmedia_1.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_2.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_3.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_4.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_5.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_6.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_7.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_8.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_9.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_10.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_11.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_12.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_13.ts?wowzasessionid=184420502\n#EXTINF:16.666,\nmedia_14.ts?wowzasessionid=184420502\n#EXTINF:16.667,\nmedia_15.ts?wowzasessionid=184420502'
pattern = r"""
\\        # Match literal backslash
nmedia_   # Match the text 'nmedia_'
(         # Begin capturing group 1.
\d+       # Match one or more digits.
)         # End capturing group 1.
\.        # Match a literal dot.
ts        # Match the text 'test'
"""
pattern_match = re.compile(pattern, re.VERBOSE)
match = pattern_match.findall(s)
print(match)
#['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15']

这是一个 demo .

关于python - 在 Python 中使用正则表达式提取多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33769298/

相关文章:

python - 如何使用 Selenium webdriver 选择此文本字段?

python - 将函数输出放入 Python 列表

regex - 在 awk 中的反斜杠 ("\") 分隔符上拆分字符串?

sql-server - 在没有 MDS 的情况下部署 SQL 2008 R2 MDS 函数

python - 为什么这是else : pass needed for processing to continue?

python-2.7 - 仍然收到 python 模块 "ImportError"消息

python - 使用 Python 到 Access .accdb 数据库的 DAO 连接

python - 合并两个数据帧以模仿 'select * from tablea, tableb'

Python 正则表达式与换行符匹配

python - 使用 pip 安装 Beautiful Soup