如何实现含特殊字符的完整子串匹配?替代\b正则方法
朴素字符串匹配方案实现
原有方案的问题
现有字符串匹配代码依赖正则的单词边界\b实现:
import re def contains(string, word): return bool(re.search(rf"\b{word}\b", string))
但\b仅将字母数字、下划线视为单词组成部分,导致带标点的完整子串无法被匹配——比如调用contains("hello world!", "world!")返回False,反而contains("hello world!", "world")返回True,不符合实际需求。
需求明确
需要实现一种「朴素」的匹配逻辑:子串的开头必须是父字符串的起始位置或空格,子串的结尾必须是父字符串的结束位置或空格。对应上述示例,期望contains("hello world!", "world!")返回True,contains("hello world!", "world")返回False。
实现代码
修改正则规则,直接匹配边界或空格,并对目标子串做转义处理(避免正则特殊字符干扰):
import re def contains(string, word): # 匹配开头为字符串起始/空格、结尾为空格/字符串结束的目标子串 return bool(re.search(rf"(?:^| ){re.escape(word)}(?: |$)", string))
测试验证
contains("hello world!", "world!")→True(符合预期,完整匹配带标点的子串)contains("hello world!", "world")→False(不符合匹配规则,因为world后紧跟!而非空格/字符串结尾)contains("hello", "hello")→True(子串为整个字符串,匹配边界)contains("hi there test", "there")→True(子串前后均为空格,符合规则)
内容的提问来源于stack exchange,提问作者user7585848
相关产品推荐
相关产品推荐

