You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:10:55