如何用正则表达式删除单词开头、首尾连字符且保留单词中间连字符
连字符过滤实现方案
核心思路
仅匹配两类需要删除的连字符,保留前后均为字母/数字的连字符不做处理:
- 出现在单词开头(连字符前方无有效字母/数字)
- 出现在单词结尾(连字符后方无有效字母/数字)
正确实现代码
import re # 待处理文本 input_text = "ease singapore-based -fis -sgfis- fatca" # 正则替换 processed_text = re.sub(r'(?<![A-Za-z0-9])-|-(?![A-Za-z0-9])', '', input_text) print(processed_text)
正则说明
(?<![A-Za-z0-9])-:负向后顾断言,匹配前方没有字母/数字的连字符,对应单词开头的连字符场景|:逻辑或-(?![A-Za-z0-9]):负向前瞻断言,匹配后方没有字母/数字的连字符,对应单词结尾的连字符场景
运行结果
ease singapore-based fis sgfis fatca
原正则错误原因
你之前使用的re.sub(r'[^A-Za-z0-9]+', ' ', input_text)会将所有非字母数字的字符统一替换为空格,连字符属于非字母数字字符,因此无论位置如何都会被删除,不符合保留中间连字符的需求。
内容的提问来源于stack exchange,提问作者go sgenq
相关产品推荐
相关产品推荐

