【问题标题】:Regex substitute based on a condition基于条件的正则表达式替换
【发布时间】:2020-10-16 02:41:54
【问题描述】:

我目前正在尝试对熊猫数据框 df 进行简单的正则表达式替换,下面是我的正则表达式

df['data] = [re.sub(r'(\s?[a-zA-Z0-9]{5,10})+(;|:)+(\s?[a-zA-Z0-9]{5,10})','combo', str(x)) 

但是,我希望仅当某行包含“电子邮件”一词超过 2 次时才进行此替换。在 python 中是否有任何有效的方法来执行此操作。

Input:

Row 1 : testdata1:testdata1 testdata2:testdata2 
Row 2 : testdata1:testdata1 testdata2:testdata2 email
Row 3 : email testdata1:testdata1 email testdata2:testdata2 email

预期输出:

Row 1 : testdata1:testdata1 testdata2:testdata2 
Row 2 : testdata1:testdata1 testdata2:testdata2 email
Row 3 : email combo email combo email

【问题讨论】:

  • 这里的替换逻辑是什么?
  • 最佳方法可能是执行"row".count("email") 并检查是否有两个以上的实例。如果是这样,请使用正则表达式 [a-zA-Z0-9]{5,10}[;:][a-zA-Z0-9]{5,10} 运行 re.sub
  • 我对python很陌生,如果下面的方法有误,我很抱歉。如果 df.data.str.count("Email") > 2: df['data'] = [re.sub(r'(https?:\/\/)?\w+( \.\w+)+(\/\w+)*(\/\w+\.\w+)?(\?[\w%&=.]*)*(?=[^\w.?&%= ])','combo', str(x)) for x in df['data']] else: pass ' 我得到一个错误“一个系列的真值是不明确的。使用 a.empty, a. bool()、a.item()、a.any() 或 a.all()。"

标签: python regex pandas dataframe


【解决方案1】:

首先,我认为您需要另一种正则表达式模式,例如

\b[a-zA-Z0-9]{5,10}\s?[;:]+\s?[a-zA-Z0-9]{5,10}\b

Pandas 代码如下所示

df.loc[df['data'].str.count("email") > 2, 'data'] = df['data'].str.replace(r'\b[a-zA-Z0-9]{5,10}\s?[;:]+\s?[a-zA-Z0-9]{5,10}\b','combo')

或者,仅将单词 email 视为一个完整单词:

df.loc[df['data'].str.count(r"\bemail\b") > 2, 'data'] = df['data'].str.replace(r'\b[a-zA-Z0-9]{5,10}\s?[;:]+\s?[a-zA-Z0-9]{5,10}\b','combo')

请参阅regex demo。详情:

  • \b - 单词边界
  • [a-zA-Z0-9]{5,10} - 五到十个字母数字字符
  • \s? - 可选空格
  • [;:]+ - 1+ 分号或冒号
  • \s? - 可选空格
  • [a-zA-Z0-9]{5,10}\b - 五到十个字母数字字符和一个单词边界。

使用df['data'].str.count(r"\bemail\b") > 2,会创建一个“掩码”,只有出现两次以上email 单词的行才会受到影响。

熊猫测试:

>>> df.loc[df['data'].str.count("email") > 2, 'data'] = df['data'].str.replace(r'\b[a-zA-Z0-9]{5,10}\s?[;:]+\s?[a-zA-Z0-9]{5,10}\b','combo')
>>> df
                                            data
0        testdata1:testdata1 testdata2:testdata2
1  testdata1:testdata1 testdata2:testdata2 email
2                  email combo email combo email

【讨论】:

  • 谢谢维克托。这是我所期待的
猜你喜欢
  • 1970-01-01
  • 2021-09-04
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 2019-02-07
  • 2012-06-10
  • 2020-05-01
相关资源
最近更新 更多