【问题标题】:Replace entire string based on regex match根据正则表达式匹配替换整个字符串
【发布时间】:2026-02-19 06:45:01
【问题描述】:

我有一个大熊猫电子邮件地址数据框,想用“Edu”替换所有 .edu 电子邮件。我想出了一种效率极低的方法,但必须有更好的方法。我就是这样做的:

import pandas as pd
import re
inp = [{'c1':10, 'c2':'gedua.com'},   {'c1':11,'c2':'wewewe.Edu'},   {'c1':12,'c2':'wewewe.edu.ney'}]
dfn = pd.DataFrame(inp)

for index, row in dfn.iterrows():
    try:
        if len(re.search('\.edu', row['c2']).group(0)) > 1:
            dfn.c2[index] = 'Edu'
            print('Education')
    except:
        continue

【问题讨论】:

  • 所以您只想更改最后一封电子邮件,即使第二封电子邮件以.Edu 结尾?或者您是否还想更改 .edu 的所有变体而不考虑大小写?
  • 是的,很抱歉我写了“.Edu”。我要替换的是“.edu”

标签: python regex string pandas


【解决方案1】:

使用str.contains 进行不区分大小写的选择,并使用loc 进行赋值。

dfn.loc[dfn.c2.str.contains(r'\.Edu', case=False), 'c2'] = 'Edu'    
dfn

   c1         c2
0  10  gedua.com
1  11        Edu
2  12        Edu

如果只是结尾你想替换.edu的邮件,那么

dfn.loc[dfn.c2.str.contains(r'\.Edu$', case=False), 'c2'] = 'Edu'

或者,按照 piR 的建议,

dfn.loc[dfn.c2.str.endswith('.Edu'), 'c2'] = 'Edu'

dfn

   c1              c2
0  10       gedua.com
1  11             Edu
2  12  wewewe.edu.ney  

【讨论】:

  • 另外,dfn.loc[dfn.c2.str.endswith('.Edu'), 'c2']
【解决方案2】:

replace

dfn.replace('^.*\.Edu$', 'Edu', regex=True)

   c1              c2
0  10       gedua.com
1  11             Edu
2  12  wewewe.edu.ney

模式'^.*\.Edu$' 表示从字符串的开头抓取所有内容,直到我们找到'.Edu',然后是字符串的结尾,然后将整个内容替换为'Edu'


特定列

您可能希望将范围限制为一列(或多列)。您可以通过将字典传递给 replace 来做到这一点,其中外部键指定列,字典值指定要替换的内容。

dfn.replace({'c2': {'^.*\.Edu$': 'Edu'}}, regex=True)

   c1              c2
0  10       gedua.com
1  11             Edu
2  12  wewewe.edu.ney

不区分大小写 [thx @coldspeed]

pandas.DataFrame.replace 没有大小写标志。但是您可以使用'(?i)' 将其嵌入到模式中

dfn.replace({'c2': {'(?i)^.*\.edu$': 'Edu'}}, regex=True)

   c1              c2
0  10       gedua.com
1  11             Edu
2  12  wewewe.edu.ney

【讨论】:

    最近更新 更多