Python正则匹配指定连续词(允许XML标签/标点间隔)并获取索引
解决方案:Python正则匹配特定词对并定位最后匹配的第二个词结束位置
核心思路
要满足需求,正则需实现以下核心逻辑:
- 支持匹配含Unicode字符、标点的目标词
- 允许目标词前后出现空格、标点、XML标签
- 两词之间仅允许空格、标点、XML标签,不能有其他单词或无关文本
- 定位最后一次匹配的第二个词的结束索引,用于插入自定义标签
正则表达式构造
基于需求构造的正则及封装函数如下:
import re def find_last_word2_end(word1, word2, text): # 转义目标词,避免特殊字符被解析为正则元字符 escaped_word1 = re.escape(word1) escaped_word2 = re.escape(word2) # 定义允许出现的内容:空格、Unicode标点/符号、任意XML标签 allowed_content = r'(?:\s|[\p{P}\p{S}]|<[^>]+>)*' # 组合完整正则模式 pattern = re.compile( fr'{allowed_content}{escaped_word1}{allowed_content}({escaped_word2}){allowed_content}', re.DOTALL | re.VERBOSE ) # 查找所有匹配结果,取最后一个 matches = list(pattern.finditer(text)) if matches: # 返回第二个词的结束索引(捕获组1的结束位置) return matches[-1].end(1) return -1
代码示例与验证
以用户提供的参数和文本为例:
word_1 = 'وتعالی' word_2 = ':' string = '''<Hadith><Document> قال:</Document> و سأله<Person> الحسین بن أسباط</Person> - و أنا أسمع - عن الذبیح <Prophet> إسماعیل</Prophet> أو<Prophet> إسحاق</Prophet> ؟ فقال:«<Prophet> إسماعیل</Prophet> ، أما سمعت قول الله تبارک و تعالی:«<Ayah WordIndex="۱-۲" Soreh="۳۷" Name="الصافات" Ayah="۱۱۲" AyahList="۱۱۲"> و بشرناه </Ayah> » «<Ayah WordIndex="۳-۳" Soreh="۳۷" Name="الصافات" Ayah="۱۱۲" AyahList="۱۱۲"><Prophet> بإسحاق</Prophet> </Ayah> » .</Hadith> فقال : « إسماعیل ، أما سمعت قول الله تبارک وتعالی : ''' # 获取第二个词的结束索引 end_idx = find_last_word2_end(word_1, word_2, string) if end_idx != -1: # 在目标位置插入自定义XML标签 new_string = string[:end_idx] + '<custom_tag>' + string[end_idx:] print(new_string) else: print("未找到符合条件的匹配")
正则关键细节说明
[\p{P}\p{S}]:匹配所有Unicode标点和符号,覆盖多语言场景(如阿拉伯语标点)<[^>]+>:匹配任意XML标签(包括带属性、自闭合的标签)(?:...):非捕获组,用于分组匹配规则但不生成额外捕获结果,提升匹配效率re.escape():对目标词进行转义,处理含正则元字符的情况(如示例中的冒号:)re.DOTALL:让正则支持多行文本匹配(匹配换行符)re.VERBOSE:允许正则添加注释,提升可读性
规则验证
- 符合匹配的场景:
<xml>وتعالی</xml> :→ 两词间为XML标签,属于允许内容,会被匹配 - 不符合匹配的场景:
وتعالی الی صتیدشنتد :→ 两词间存在其他阿拉伯语单词,不属于允许内容,不会被匹配 - 英文示例场景:
hello<xml></xml>:(假设word1=hello,word2=:)→ 符合规则会被匹配;若为hello: there :,因两词间存在无关单词there`,不会被匹配
原尝试正则的问题
- 第一个正则强制要求目标词被XML标签包裹,且限制中间只能是标签,不符合“词前后可出现空格/标点”的需求
- 第二个正则颠倒了
word1和word2的顺序,且同样强制词在标签内,完全不符合匹配逻辑
内容的提问来源于stack exchange,提问作者Mostafa Kooti
相关产品推荐
相关产品推荐

