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

Python 3.10正则表达式:清除特殊字符但保留复合词连字符问题

保留复合词连字符的文本清理方案(Python 3.10)

问题场景

需要清理文本中的所有特殊字符,但必须保留self-restraint、e-mail这类由字母+连字符+字母组成的复合词中的连字符,确保复合词结构完整。现有正则尝试均未达到预期效果:

输入文本:

This is -a -! -sample- ? e-mail text?classification? example- ! ?\} {]}[¿ with !self-restraint( - like @, #, and $.

实际输出(不符合预期):

This is a sample  e mail text classification example with !self restraint like and

预期输出:

This is a sample e-mail text classification example with self-restraint like and

解决方案

这里提供两种可靠的实现方式:

方法1:占位符中转法(逻辑直观,易维护)

通过三步操作避免复杂正则断言的边界问题,先保护合法连字符,再清理特殊字符,最后恢复连字符:

import re

text = "This is -a -! -sample- ? e-mail text?classification? example- ! ?\} {]}[¿ with !self-restraint( - like @, #, and $."

# 1. 用占位符替换复合词中的合法连字符
temp_text = re.sub(r'(\b[a-zA-Z]+)-([a-zA-Z]+\b)', r'\1###HYPHEN###\2', text)
# 2. 清理所有非单词、非空格的特殊字符
cleaned_temp = re.sub(r'[^\w\s]', ' ', temp_text)
# 3. 将占位符换回连字符
final_cleaned = re.sub(r'###HYPHEN###', '-', cleaned_temp)
# 4. 合并多余空格并去除首尾空格
final_cleaned = re.sub(r'\s+', ' ', final_cleaned).strip()

print(final_cleaned)

方法2:正则断言法(简洁高效)

通过反向/正向断言精准区分合法连字符与孤立连字符,直接完成清理:

import re

text = "This is -a -! -sample- ? e-mail text?classification? example- ! ?\} {]}[¿ with !self-restraint( - like @, #, and $."

# 匹配两类需要替换的内容:
# 1. 不在字母开头之后/不在字母结尾之前的孤立连字符
# 2. 除单词字符、空格、连字符外的所有特殊字符
cleaned_text = re.sub(r'(?<!\b[a-zA-Z])-(?![a-zA-Z]\b)|[^\w\s-]', ' ', text)
# 合并多余空格并去除首尾空格
cleaned_text = re.sub(r'\s+', ' ', cleaned_text).strip()

print(cleaned_text)

效果验证

两种方法运行后均可得到预期输出:

This is a sample e-mail text classification example with self-restraint like and

内容的提问来源于stack exchange,提问作者AlejandroB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:45:54