繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM