如何让pandas.Series.str.extract()在正则不匹配时保留原字符串值
如何让pandas.Series.str.extract()在正则不匹配时保留原字符串值
嘿,我完全懂你的困扰!你想从字符串里提取邮箱,遇到带尖括号的就把里面的内容取出来,但那些本来就格式正常(没有尖括号)的邮箱,可不想被转换成NaN,对吧?
其实有两个简单的办法可以解决这个问题:
方法一:结合extract和fillna补回原数据
你原来的extract操作只会保留匹配到的内容,不匹配的就变成NaN,那我们直接把这些NaN的位置填回原来的字符串就好啦:
# 用expand=False确保返回Series,然后fillna补回原数据 curr_emails = curr_emails.str.extract(r"<([^<>]+)>", expand=False).fillna(curr_emails)
这样一来,匹配到尖括号的行就会提取出里面的邮箱,没匹配到的行就保留原本的邮箱字符串,不会变成NaN了。
方法二:用str.replace直接移除尖括号(更简洁)
仔细想想,你的需求其实就是去掉邮箱两端可能存在的尖括号,不管有没有都处理一下,那用str.replace反而更直接:
# 匹配开头的<或者结尾的>,替换为空字符串 curr_emails = curr_emails.str.replace(r"^<|>$", "", regex=True)
这个正则表达式^<|>$的意思是:匹配字符串开头的<,或者字符串结尾的>,然后把它们替换成空。这样带尖括号的邮箱会被去掉括号,不带的就完全保持原样,刚好符合你的预期输出。
两种方法都能达到你想要的效果,第二种更简洁高效哦~
备注:内容来源于stack exchange,提问作者Caleb Renfroe
相关产品推荐
相关产品推荐

