如何用Python的re.findall匹配多个子串?优化提取代码方案
更简洁的多前缀子串提取实现方法
首先纠正你原代码里的一个小问题:re.findall的第二个参数必须是单个字符串,不能直接传入列表,需要遍历数组中的每个元素进行处理。
下面提供两种更简洁的实现方式:
方法一:正则表达式一次匹配多前缀
利用正则的**选择符|**合并多个前缀,通过非捕获分组(?:...)避免返回多余的分组内容,只需一次编译正则,遍历数组提取所有匹配项:
import re some_array = ['MATH_SOME_TEXT_AND_NUMBER MORE_TEXT SOME_VALUE', 'SCIENCE_SOME_TEXT_AND_NUMBER MORE_TEXT SOME_VALUE', 'ART_SOME_TEXT_AND_NUMBER MORE_TEXT SOME_VALUE'] # 编译匹配多前缀的正则模式 pattern = re.compile(r'(?:MATH|SCIENCE|ART)_.*? ') all_matches = [] for item in some_array: # 提取当前字符串的所有匹配项并加入结果列表 all_matches.extend(pattern.findall(item)) print(all_matches) # 输出: ['MATH_SOME_TEXT_AND_NUMBER ', 'SCIENCE_SOME_TEXT_AND_NUMBER ', 'ART_SOME_TEXT_AND_NUMBER ']
如果不需要保留末尾的空格,可以把模式改成r'(?:MATH|SCIENCE|ART)_[^ ]+',这样会匹配到下一个空格前的所有内容。
方法二:字符串方法(无需正则)
如果你的字符串格式固定(前缀后紧跟内容,以空格分隔),用字符串的startswith方法结合遍历判断更高效易懂:
some_array = ['MATH_SOME_TEXT_AND_NUMBER MORE_TEXT SOME_VALUE', 'SCIENCE_SOME_TEXT_AND_NUMBER MORE_TEXT SOME_VALUE', 'ART_SOME_TEXT_AND_NUMBER MORE_TEXT SOME_VALUE'] target_prefixes = ('MATH_', 'SCIENCE_', 'ART_') all_matches = [] for item in some_array: # split()自动处理多个空格,分割成单词列表 for part in item.split(): if part.startswith(target_prefixes): all_matches.append(part) print(all_matches) # 输出: ['MATH_SOME_TEXT_AND_NUMBER', 'SCIENCE_SOME_TEXT_AND_NUMBER', 'ART_SOME_TEXT_AND_NUMBER']
内容的提问来源于stack exchange,提问作者pekoms
相关产品推荐
相关产品推荐

