正则表达式单行仅匹配某个单词后面的内容?

sim*_*ple 5 python regex python-2.7

我想从这样的列表中提取歌曲名称: 'some text here, songs: song1, song2, song3, fro: othenkl'并 get ['song1', 'song2', 'song3']。所以我尝试用一​​个正则表达式来完成它:

result =  re.findall('[Ss]ongs?:?.*', 'songs: songname1, songname2,')
print re.findall('(?:(\w+),)*', result[0])
Run Code Online (Sandbox Code Playgroud)

这完全匹配:( ['', '', '', '', '', '', '', 'songname1', '', 'songname2', '']除了空字符串,但是 nbd.

但我想用一行来完成,所以我执行以下操作:

print re.findall('[Ss]ongs?:?(?:(\w+),)*','songs: songname1, songname2,')
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么这无法捕获与上面两个正则表达式相同的内容:

['', 'name1', 'name2']
Run Code Online (Sandbox Code Playgroud)

有没有办法在一行中完成这个任务?这里简洁一些会很有用。谢谢。

Kas*_*mvd 2

在这种情况下您不需要使用re.findall,您最好使用re.search来查找歌曲序列,然后用逗号分隔结果,。此外,您不需要使用字符类[Ss]来匹配大写字母,您可以使用忽略大小写标志 ( re.I) :

>>> s ='some text here, songs: song1, song2, song3, fro: othenkl'
>>> re.search(r'(?<=songs:)(.+),', s,flags=re.I).group(1).split(',')
[' song1', ' song2', ' song3']
Run Code Online (Sandbox Code Playgroud)

(?<=songs:)后面是一个积极的外观,这将使您的正则表达式引擎匹配前面的字符串songs:,并将(.+),匹配最大的字符串,后面songs:跟着逗号,这是您的歌曲的序列。

另外,作为一种更通用的方法,您可以捕获歌曲名称,而不是在正则表达式末尾指定逗号,因为它们后面跟着这个模式\s\w+:

>>> re.search(r'(?<=songs:)(.+)(?=\s\w+:)', s).group(1).split(',')
[' song1', ' song2', ' song3', '']
Run Code Online (Sandbox Code Playgroud)