我想从这样的列表中提取歌曲名称:'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']
有没有办法在一行中完成此操作?在这里简明扼要是有用的。谢谢。
答案 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', '']