正则表达式单行只能匹配某个单词之后的内容?

时间:2015-10-17 18:26:51

标签: python regex python-2.7

我想从这样的列表中提取歌曲名称:'some text here, songs: song1, song2, song3, fro: othenkl'并获取['song1', 'song2', 'song3']。所以我试着在一个正则表达式中做到这一点:

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

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

但我想在一行中完成,所以我会做以下事情:

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

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

['', 'name1', 'name2']

有没有办法在一行中完成此操作?在这里简明扼要是有用的。谢谢。

2 个答案:

答案 0 :(得分:2)

不,你不能用re模块在一个模式中做到这一点。 您可以做的是使用regex module代替此模式:

regex.findall(r'(?:\G(?!\A), |\msongs: )(\w++)(?!:)', s)

\G是上一次匹配后的位置,\A字符串的开头,\m字边界后跟单词字符,++占有量词

答案 1 :(得分:1)

在这种情况下,您不需要使用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']

(?<=songs:)背后有一个积极的外观,它会使你的正则表达式引擎匹配songs:之前的字符串,而(.+),将匹配songs:之后的逗号后面的最大字符串这是你歌曲的顺序。

另外,作为更通用的方法而不是在正则表达式的末尾指定逗号,您可以根据这一事实捕获歌曲名称,即{〗\s\w+:

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