2015-11-17 2 views
2

Я новичок в регулярном выражении и не могу понять, как создать массив, содержащий совпадения, такие как \nmedia_1.ts, \nmedia_2.ts и т. Д. Из строки s, как показано ниже.Извлечение нескольких совпадений с использованием Regex в Python

Любые предложения относительно того, как выражение регулярного выражения может быть улучшено?

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 

ответ

1

я рекомендовал бы быть явным, как это возможно с помощью регулярных выражений заявления. Поэтому улучшение, которое я бы рекомендовал, было бы \d+ для соответствия одной или нескольким цифрам вместо .*, ноль или более всего.

Поскольку вы новичок в регулярном выражении, вам может быть интересен использование подробного флага. (Это также просто хорошо для документации.) Вот пример кода:

# -*- 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.

0

Вы должны удалить группу захвата, и вы должны должны использовать \n символ новой строки не n в регулярном выражении.

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

Если вы Wnt только номер,

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'] 
>>> 
Смежные вопросы