Nyxynyx
Nyxynyx

Reputation: 63599

Extracting multiple matches using Regex in Python

I'm new to regex and cannot seem to figure out how to create an array containing matches like \nmedia_1.ts, \nmedia_2.ts, etc from the string s as shown below.

Any suggestions on how the regex expression can be improved?

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

Upvotes: 2

Views: 95

Answers (2)

Michelle Welcks
Michelle Welcks

Reputation: 3894

I'd recommend being explicit as possible with your regex statement. So the improvement I'd recommend would be \d+ to match one or more digits instead of .*, zero or more of anything.

Since you're new to regex, using the verbose flag might be of interest to you. (It's also just good for documentation.) Here's a code sample:

# -*- 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']

And here's a demo.

Upvotes: 1

Avinash Raj
Avinash Raj

Reputation: 174696

You need to remove the capturing group and you must need to use \n newline character not n in regex.

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

If you wnt only the number,

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

Example:

>>> 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']
>>> 

Upvotes: 0

Related Questions