Python正则如何匹配非单词字符且排除URL内字符实现文本分割
问题原因
你原来的实现存在两个核心问题:
re.split()遇到捕获组时会把捕获到的内容插入结果列表,你给\W加了括号,导致空格、冒号这些分隔符都被保留进了结果- URL匹配分支没有加捕获,匹配到URL时对应捕获组会返回
None,同时还会产生多余的空字符串片段
最优实现方案
不需要用分割逻辑,直接用re.findall()匹配所有你需要保留的内容即可:要么是完整URL,要么是连续的单词字符,一行就能实现需求:
import re message = 'this is a test: https://www.google.com' # 沿用你原来的URL匹配规则 url_pattern = r"https*:\/\/[\w\.]+\.[a-zA-Z]*[\w\/\-]+|https*:\/\/[\w\.]+\.[a-zA-Z]*|[\w\.]+\.[a-zA-Z]*\/[\w\/\-]+" # 组合匹配规则:优先匹配URL,其次匹配连续的单词字符 result = re.findall(rf"{url_pattern}|\w+", message) print(result) # 输出:['this', 'is', 'a', 'test', 'https://www.google.com']
补充说明
如果一定要用re.split实现,可以通过否定环视匹配不在URL内部的\W,但逻辑远不如findall直观,性能也没有优势,更推荐上述方案。
内容的提问来源于stack exchange,提问作者sabo
相关产品推荐
相关产品推荐

