[英]Regex one-liner for matching only what comes after a certain word?
我想从这样的列表中提取歌曲名称: '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])
这完全匹配: ['', '', '', '', '', '', '', 'songname1', '', 'songname2', '']
(除了空字符串,但是nbd。
但我想在一行中完成,所以我做了以下几点:
print re.findall('[Ss]ongs?:?(?:(\w+),)*','songs: songname1, songname2,')
但我不明白为什么这不能像上面的两个正则表达式那样捕获:
['', 'name1', 'name2']
有没有办法在一行中完成这个? 在这里简明扼要是有用的。 谢谢。
不,你不能用re模块在一个模式中做到这一点。 你可以做的是使用正则表达式模块而不是这个模式:
regex.findall(r'(?:\G(?!\A), |\msongs: )(\w++)(?!:)', s)
其中\\G
是前一个匹配后的位置, \\A
是字符串的开头, \\m
是一个单词边界后跟单词字符,而++
是一个占有量词。
你并不需要使用re.findall
在这种情况下,你最好使用re.search
找到歌曲的顺序,然后用逗号分割的结果,
。 此外,您不需要使用字符类[Ss]
来匹配您可以使用re.I
case flag( re.I
)的Capitals:
>>> 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:
和(.+),
将匹配songs:
后面的最大字符串songs:
后跟逗号,即歌曲的序列。
另外,作为一种更通用的方式而不是在正则表达式的末尾指定逗号,您可以根据这一事实捕获歌曲名称,即它们后面跟着这个模式\\s\\w+:
.
>>> re.search(r'(?<=songs:)(.+)(?=\s\w+:)', s).group(1).split(',')
[' song1', ' song2', ' song3', '']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.