You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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`,不会被匹配

原尝试正则的问题

  1. 第一个正则强制要求目标词被XML标签包裹,且限制中间只能是标签,不符合“词前后可出现空格/标点”的需求
  2. 第二个正则颠倒了word1和word2的顺序,且同样强制词在标签内,完全不符合匹配逻辑

内容的提问来源于stack exchange,提问作者Mostafa Kooti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:39:52