You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式移除含空格的电子邮件地址?

处理带空格的邮箱地址替换问题

针对呼叫中心转录文本中,语音转文字生成的带空格的邮箱(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:46:02