基于条件的正则表达式替换



我目前正在尝试在熊猫数据帧 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

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

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

熊猫代码可能看起来像

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"bemailb") > 2, 'data'] = df['data'].str.replace(r'b[a-zA-Z0-9]{5,10}s?[;:]+s?[a-zA-Z0-9]{5,10}b','combo')

请参阅正则表达式演示。详:

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

使用df['data'].str.count(r"bemailb") > 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

最新更新