使用正则表达式匹配单词时,b 边界模式有时会产生意外的结果,特别是当单词包含特殊字符时字符。
考虑短语“test Sortesindex[persons]{Sortes} text”。使用 b
形式上,b 匹配单词字符 (w) 和非单词字符之间的边界(W),或字符串的开头/结尾。当单词边界模式后面紧跟着一个特殊字符(如 [ 或 })时,b 只需要在特殊字符后面有一个单词字符。
要解决对于这个问题,可以使用自适应单词边界或明确的单词边界。
自适应单词边界处理模式两侧的单词和非单词字符的任意组合:
re.search(r'(?:(?!\w)|\b(?=\w)){}(?:(?<=\w)\b|(?<!\w))'.format(re.escape('Sortes\index[persons]{Sortes}')), 'test Sortes\index[persons]{Sortes} test')
明确的单词边界 要求模式两侧没有单词字符:
re.search(r'(?<!\w){}(?!\w)'.format(re.escape('Sortes\index[persons]{Sortes}')), 'test Sortes\index[persons]{Sortes} test')
自适应字边界更加通用,但允许前导和尾随非单词字符。明确的单词边界更加严格,确保没有周围的单词字符。
用于自适应和明确单词边界的环视模式可以根据匹配任务的具体要求进行定制。例如,要仅匹配模式周围的非字母,请使用 [^Wd_] 而不是 w.
以上是为什么正则表达式单词边界 (\b) 对特殊字符表现不佳?的详细内容。更多信息请关注PHP中文网其他相关文章!