Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用正则表达式提取多个匹配项_Python_Regex_Python 2.7 - Fatal编程技术网

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

在Python中使用正则表达式提取多个匹配项,python,regex,python-2.7,Python,Regex,Python 2.7,我不熟悉正则表达式,似乎不知道如何从字符串s中创建包含匹配项的数组,如\nmedia\u 1.ts,\nmedia\u 2.ts,如下所示 关于如何改进正则表达式有什么建议吗 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.

我不熟悉正则表达式,似乎不知道如何从字符串
s
中创建包含匹配项的数组,如
\nmedia\u 1.ts
\nmedia\u 2.ts
,如下所示

关于如何改进正则表达式有什么建议吗

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

您需要删除捕获组,并且必须在正则表达式中使用
\n
换行字符而不是
n

pattern = re.compile(r'\nmedia_.*?\.ts', flags=re.IGNORECASE)
match = pattern.findall(s)
如果你只知道号码

pattern = re.compile(r'\nmedia_(.*?)\.ts', flags=re.IGNORECASE)
match = pattern.findall(s)
例如:

>>> import re
>>> pattern = re.compile(r'\nmedia_(.*?)\.ts', flags=re.IGNORECASE)
>>> 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.findall(s)
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15']
>>> pattern = re.compile(r'\nmedia_.*?\.ts', flags=re.IGNORECASE)
>>> pattern.findall(s)
['\nmedia_1.ts', '\nmedia_2.ts', '\nmedia_3.ts', '\nmedia_4.ts', '\nmedia_5.ts', '\nmedia_6.ts', '\nmedia_7.ts', '\nmedia_8.ts', '\nmedia_9.ts', '\nmedia_10.ts', '\nmedia_11.ts', '\nmedia_12.ts', '\nmedia_13.ts', '\nmedia_14.ts', '\nmedia_15.ts']
>>> 

我建议您在正则表达式声明中尽可能明确。因此,我建议的改进是
\d+
匹配一个或多个数字,而不是
*
,零个或多个数字

由于您是regex新手,使用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']
这里有一个例子