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

如何用正则表达式删除Pandas DataFrame中符合规则的行

Pandas按标签与内容位置过滤行

问题背景

现有如下Pandas DataFrame:

import pandas as pd

df = pd.DataFrame(
    {
        'a': [
            '#x{LA 0.098:abc}',
            '#x{LA abc:0.31}',
            '#x{BC abc:0.1231}',
            '#x{LA 0.333:abc}',
            '#x{CN 0.031:abc}',
            '#x{YM abc:12345}',
            '#x{YM 1222:abc}',
        ]
    }
)

同时有两个标签规则列表:

labels_that_abc_is_right = ['LA', 'CN']
labels_that_abc_is_left = ['YM', 'BC']

需求

  • 删除包含labels_that_abc_is_right中标签且**"abc"在冒号右侧**的行
  • 删除包含labels_that_abc_is_left中标签且**"abc"在冒号左侧**的行

期望输出

a
1    #x{LA abc:0.31}
6    #x{YM 1222:abc}

解决方案

方法一:正则匹配直接筛选(简洁版)

直接构造匹配需要删除的行的正则表达式,通过取反保留符合要求的行:

# 构造匹配待删除行的正则:两种违规情况用|分隔
drop_pattern = fr'#x\{{({"|".join(labels_that_abc_is_right)}) [^:]+:abc\}}|#x\{{({"|".join(labels_that_abc_is_left)}) abc:[^}]+\}}'

# 取反筛选,保留非违规行
filtered_df = df[~df['a'].str.contains(drop_pattern)]

正则逻辑说明

  • 第一部分:匹配labels_that_abc_is_right中的标签(如LA/CN),后续是任意非冒号内容,最后以:abc}结尾的行(即abc在冒号右侧的违规行)
  • 第二部分:匹配labels_that_abc_is_left中的标签(如YM/BC),后续是abc:,最后接任意非}内容的行(即abc在冒号左侧的违规行)
  • 用~对匹配结果取反,保留不需要删除的行

方法二:提取字段后筛选(易读版)

如果需要更清晰的逻辑,可以先提取每行的标签、冒号左右内容,再通过布尔条件筛选:

# 正则捕获标签、冒号左侧内容、冒号右侧内容
pattern = r'#x\{([A-Z]+) ([^:]+):([^}]+)\}'
matches = df['a'].str.extract(pattern)
matches.columns = ['label', 'left_content', 'right_content']

# 合并提取结果到原DataFrame
df_with_details = pd.concat([df, matches], axis=1)

# 构造筛选条件:排除两种违规情况
cond1 = ~((df_with_details['label'].isin(labels_that_abc_is_right)) & (df_with_details['right_content'] == 'abc'))
cond2 = ~((df_with_details['label'].isin(labels_that_abc_is_left)) & (df_with_details['left_content'] == 'abc'))

# 应用条件并清理临时列
filtered_df = df_with_details[cond1 & cond2].drop(columns=['label', 'left_content', 'right_content'])

两种方法执行后,都能得到期望的输出结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:11:13