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