Python正则如何移除句尾以-开头、逗号结尾的字符串?
问题说明
现有字符串列表如下:
docs = ["This is blue -Gary,.", "Let's go swim. Sounds good -Mark,", "How are you? Mark says yes. Let's go - Grant,"]
需要移除每个字符串末尾、-和逗号之间的姓名内容,期望输出结果:
docs = ["This is blue", "Let's go swim. Sounds good", "How are you? Mark says yes. Let's go"]
之前尝试的正则代码未生效,无法实现需求:
re.sub(r'_^\b.*?[,]\s+', '', x)
失效原因
你写的正则存在几个逻辑错误:
- 开头的
_^完全不符合匹配规则:^是匹配字符串起始位置的锚点,但需要删除的内容在字符串末尾,匹配方向完全错误,前缀的下划线也没有对应可匹配的实际字符 - 匹配顺序颠倒:目标片段结构是「尾部的
-+ 可选空格 + 姓名 + 逗号 + 可选尾部标点」,正则里先匹配逗号的逻辑和实际结构不符 - 没有锚定字符串末尾,容易误匹配句子中间的同类字符组合。
正确实现代码
import re docs = ["This is blue -Gary,.", "Let's go swim. Sounds good -Mark,", "How are you? Mark says yes. Let's go - Grant,"] result = [re.sub(r'\s*-\s*[^,]+,.*?$', '', item) for item in docs]
执行后result的值和预期输出完全一致。
正则规则说明
\s*-\s*:匹配连字符-,以及它前后可能存在的任意数量空白,兼容-Gary、- Grant这类不同的空格写法[^,]+:匹配-之后到第一个逗号前的所有内容,也就是需要删除的姓名部分,.*?$:匹配逗号本身,以及逗号之后到字符串末尾的所有剩余字符(比如第一个字符串中逗号后的.),$锚定字符串末尾,避免误匹配句子中间出现的-和逗号。
内容的提问来源于stack exchange,提问作者mjoy
相关产品推荐
相关产品推荐

