如何用正则表达式移除含空格的电子邮件地址?
处理带空格的邮箱地址替换问题
针对呼叫中心转录文本中,语音转文字生成的带空格的邮箱(比如maya @ proton.me、maya.lucco @proton.me等),可以通过调整正则表达式来完整匹配并替换这些邮箱地址。
问题分析
原正则\S*@\S*\s?仅匹配无空格的连续字符,遇到邮箱内有空格时,会把空格前后的内容拆分开,导致部分内容残留(比如maya @ proton.me会被拆成maya 和@ proton.me,只替换后者,留下maya)。
解决方案
使用能匹配@前后带空格的合法邮箱片段的正则,完整捕获整个邮箱地址:
import re import pandas as pd # 测试数据 test = ['some random text maya @ proton.me with some more text maya+lucco@proton.me', 'maya-lucco@proton.me with another address maya_lucco@proton.me', 'some text maya.lucco @proton.me with some more bla maya.lucco@proton.me', 'maya-lucco_@proton.me more text maya@ proton.me ' ] test = pd.DataFrame(test, columns = ['words']) def anonymiseEmail(text): text = str(text).strip() # 匹配带空格的邮箱地址:本地部分允许字母/数字/._+-及空格分隔的片段,域名部分同理 email_pattern = r'\b(?:[\w._+-]+(?:\s+[\w._+-]+)*)\s*@\s*(?:[\w.-]+(?:\s+[\w.-]+)*)\b' text = re.sub(email_pattern, '{e-mail}', text) return text # 应用函数 test['noEmail'] = test.words.apply(anonymiseEmail) # 查看结果 for idx, row in test.iterrows(): print(f"原文本: {row['words']}") print(f"处理后: {row['noEmail']}\n")
正则解释
\b:单词边界,确保匹配的是完整的邮箱,而非其他字符串中的片段(?:[\w._+-]+(?:\s+[\w._+-]+)*):匹配邮箱的本地部分(@前),允许由空格分隔的多个合法字符片段(合法字符包括字母、数字、._+-)\s*@\s*:匹配@符号,允许前后有任意数量的空格(?:[\w.-]+(?:\s+[\w.-]+)*):匹配邮箱的域名部分(@后),允许由空格分隔的多个合法字符片段(合法字符包括字母、数字、.-)
关于其他思路的说明
- 你尝试的lookahead/lookbehind方案不适用,因为这类断言只能匹配位置,无法捕获前后的完整片段;
- 手动检查@前后单词的方案可行,但效率较低,且需要额外处理逻辑,正则方案更简洁高效,适合批量处理文本。
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

