如何用Python re高效提取多行字符串中Colour:后的颜色词?
解决Python多行字符串中提取Colour:后颜色词的问题
你的正则表达式'Colour:(.*?)Colour:'之所以返回空列表,是因为它试图匹配两个Colour:之间的内容,但你的字符串里每个Colour:都在单独一行的开头,没有连续的Colour:前后包裹的情况,最后一行更是没有后续的Colour:,自然匹配不到任何结果。
下面是几种用re模块实现的正确方法,其中re.findall是最简洁高效的方案:
方法1:使用re.findall(推荐,最快最简洁)
import re str_content = """ Colour: Black Colour: Green Colour: Black Colour: Red Colour: Orange Colour: Blue Colour: Green """ colors = re.findall(r'Colour:\s*(.*)', str_content) print(colors) # 输出: ['Black', 'Green', 'Black', 'Red', 'Orange', 'Blue', 'Green']
正则说明:
Colour::匹配固定前缀文本\s*:匹配冒号后面的任意空白字符(包括空格、制表符,兼容不同格式的空格数量)(.*):捕获颜色内容,.默认不匹配换行符,会自动停在每行末尾,刚好获取到完整的颜色词
方法2:使用re.finditer
如果需要获取匹配对象的额外信息(比如匹配位置),可以用re.finditer,再通过列表推导式提取捕获组:
colors = [match.group(1) for match in re.finditer(r'Colour:\s*(.*)', str_content)]
这个方法和findall效率接近,但代码稍长,适合需要处理匹配细节的场景。
不推荐使用re.search的原因
re.search只会返回第一个匹配的结果,无法一次性提取所有颜色,因此不适合你的需求。
可选优化:更严谨的正则
如果确定颜色词是单个纯字母单词(无空格、符号),可以用更精准的正则避免意外捕获:
colors = re.findall(r'Colour:\s*([A-Za-z]+)', str_content)
如果颜色可能包含空格(比如Light Blue),则保留原来的(.*)即可。
内容的提问来源于stack exchange,提问作者milo2810
相关产品推荐
相关产品推荐

