如何用Python正则移除非单词字符(保留空格及缩写句点)
问题解答
疑问1:为什么x被替换,以及如何匹配非单词且非空格的字符
你写的正则(?<=\W)[\W][\S](?=\W)里,[\S]是匹配所有非空白字符,自然包括字母x——原字符串里a.. x的空格+x正好符合这个正则的匹配规则:前面是..(非单词字符),[\W]匹配空格,[\S]匹配x,后面是空格(非单词字符),所以这两个字符被替换成了9。
要匹配非单词且非空格的字符,直接用字符类[^\w\s]就可以——这个表达式表示“不是单词字符(\w,含字母、数字、下划线)也不是空白字符(\s,含空格、制表符等)的字符”,精准对应你要的目标。
疑问2:如何移除单词边界的标点
你添加的\b\W\b无效,是因为\b是单词边界,它要求\W的前后都必须是“单词字符和非单词字符的分界”——比如what!里的!后面是空格(非单词字符),所以!的右边不存在单词边界,自然匹配不到。
正确的思路是区分“需要保留的点(缩写里的点)”和“要删除的字符”,可以用两步处理:
- 删除所有非缩写用的点,以及其他标点符号
- 统一处理多余的空格,确保只保留单个分隔空格
直接用下面的代码就能实现需求:
import re test_str = "a.. x what! he was a in the U.S.A.F but in the accounts dept?" # 匹配要删除的内容:前后不全是单词的点,或是非单词/非空格/非点的字符 clean_pattern = r"(?<!\w)\.(?!\w)|[^\w\s.]" temp_result = re.sub(clean_pattern, "", test_str) # 合并多个空格为单个,移除首尾空格 final_result = re.sub(r"\s+", " ", temp_result).strip() print(final_result)
运行后会得到预期结果:a x what he was a in the U.S.A.F but in the accounts dept
正则说明:
(?<!\w)\.(?!\w):匹配那些前面不是单词字符或者后面不是单词字符的点,这样就自动排除了U.S.A.F里的点(这些点前后都是字母,属于单词字符)[^\w\s.]:匹配所有除了单词字符、空格、点之外的字符,比如!、?这类标点\s+:把连续的多个空格替换成单个,保证单词之间只有一个分隔空格
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

