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

使用正则表达式提取子串:Pandas多子串范围提取与定位需求

在Pandas中指定范围内用正则提取子串并获取位置信息

以下是直接可落地的实现方案,针对你要在指定起止索引范围内提取子串、同时获取匹配位置和子串信息的需求:

1. 核心思路

利用Python的re.finditer()获取所有正则匹配结果(包含位置信息),过滤出完全落在指定起止范围内的匹配项,最后将结果整合到Pandas数据结构中。

2. 代码实现

步骤1:导入依赖并准备测试数据

import pandas as pd
import re

# 构造测试DataFrame
df = pd.DataFrame({
    'text': [
        '这是测试字符串:abc123def456ghi789',
        '另一个例子:xyz789jkl123mno456',
        '无匹配示例:pqrstuvwxyz'
    ]
})

步骤2:定义提取函数

这个函数处理单个字符串,返回指定范围内的所有匹配结果,包含子串内容、位置和分组信息:

def extract_in_range(text, start_idx, end_idx, pattern):
    results = []
    # 遍历所有正则匹配项
    for match in re.finditer(pattern, text):
        # 检查匹配子串是否完全落在指定区间内(可按需调整为部分重叠逻辑)
        if match.start() >= start_idx and match.end() <= end_idx:
            # 收集分组信息(支持命名分组和编号分组)
            group_details = {}
            # 优先处理命名分组
            for group_name in match.re.groupindex:
                group_details[group_name] = match.group(group_name)
            # 无命名分组时用编号分组
            if not group_details:
                for i in range(1, len(match.groups()) + 1):
                    group_details[f'分组{i}'] = match.group(i)
            
            results.append({
                '匹配子串': match.group(),
                '起始位置': match.start(),
                '结束位置': match.end(),
                '分组详情': group_details
            })
    return results if results else None

步骤3:应用函数到DataFrame

假设要在每个字符串的索引10到20之间(左闭右开)提取「字母+数字」的组合:

# 应用提取函数
df['匹配结果'] = df['text'].apply(
    lambda x: extract_in_range(x, start_idx=10, end_idx=20, pattern=r'([a-z]+)(\d+)')
)

步骤4:展开结果便于查看

如果每个字符串有多个匹配项,可将结果展开为多行:

# 展开嵌套的匹配结果
expanded_df = df.explode('匹配结果').reset_index(drop=True)
# 将字典格式的匹配结果拆分为独立列
expanded_df = pd.concat(
    [expanded_df.drop('匹配结果', axis=1), expanded_df['匹配结果'].apply(pd.Series)],
    axis=1
)

print(expanded_df)

3. 关键说明

  • 区间判断:代码默认子串完全落在指定范围内,若需允许部分重叠,可修改判断条件为match.end() > start_idx and match.start() < end_idx
  • 正则灵活度:可根据需求替换pattern参数,比如匹配特定关键词r'(abc|def|ghi)'
  • 空值处理:指定范围内无匹配时返回None,可后续用dropna()过滤无效行

内容的提问来源于stack exchange,提问作者julie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:30:38