Python实现多语言精确词替换(解决非词字符匹配问题)
在使用Python 3 Jupyter Notebook处理多语言(印地语、英语、音译词)精确替换需求时,基于\b元字符的正则方案会误匹配带非词字符的印地语词汇(如विषयों),导致部分替换不符合预期。
问题重现
原代码中搜索विषय并替换为टॉपिक时,会错误地将विषयों中的विषय部分替换为टॉपिक,得到टॉपिकों,但我们期望仅替换独立出现的विषय。
原因分析
Python的re模块默认的\b是ASCII词边界,仅将[a-zA-Z0-9_]视为词字符。印地语字符属于Unicode非ASCII字符,而ों这类梵语变音符号也不属于ASCII词字符,因此\b会把विषय和ों之间判定为词边界,触发误匹配。
解决方案
使用Unicode感知的环视断言定义真正的词边界,确保匹配的目标词前后不是任何Unicode词字符(包括印地语字母、数字等)。
修改后的代码:
import re def exact_match_replace(input_text, search_word, substitute_word): # 用Unicode字母类定义环视断言,确保词前后无其他Unicode字母 search_pattern = rf"(?<!\p{L}){re.escape(search_word)}(?!\p{L})" # 启用UNICODE标志,让正则引擎识别Unicode字符类 result = re.sub(search_pattern, substitute_word, input_text, flags=re.UNICODE | re.IGNORECASE) return result # 测试示例 input_text = "जेईई मेन पाठ्यक्रम 2024 को पढ़ने से न केवल आपको यह समझने में मदद मिलेगी कि आपको किन विषयों का अध्ययन करने की आवश्यकता है, बल्कि यह आपको तदनुसार एक अध्ययन योजना तैयार करने में भी मदद करेगा। पाठ्यक्रम आपको यह सुनिश्चित करने में भी मदद करेगा कि परीक्षा की तैयारी के दौरान आप कोई भी विषय न छोड़ें।" search_word = "विषय" substitute_word = "टॉपिक" result_text = exact_match_replace(input_text, search_word, substitute_word) print(result_text)
效果验证
运行后将得到符合预期的输出:
जेईई मेन पाठ्यक्रम 2024 को पढ़ने से न केवल आपको यह समझने में मदद मिलेगी कि आपको किन विषयों का अध्ययन करने की आवश्यकता है, बल्कि यह आपको तदनुसार एक अध्ययन योजना तैयार करने में भी मदद करेगा। पाठ्यक्रम आपको यह सुनिश्चित करने में भी मदद करेगा कि परीक्षा की तैयारी के दौरान आप कोई भी टॉपिक न छोड़ें।
细节说明
(?<!\p{L}):负向后环视,确保目标词前面不是任何Unicode字母(?!\p{L}):负向前环视,确保目标词后面不是任何Unicode字母- 若需要同时排除数字和下划线,可将
\p{L}替换为[\p{L}\p{N}_] re.escape(search_word):自动转义搜索词中的特殊字符,避免正则语法冲突
内容的提问来源于stack exchange,提问作者Ravi Gupta

