首先先行然后寻找前行匹配后面最接近的匹配捕获组。 Python 中的正则表达式

First lookahead then look for closest matching capture group behind the lookahead match. RegEx in Python

我有一个包含换行字符串的全文。以“%”开头的行是标题,以“>”开头的行包含我要在其中查找我的查询的文本。如果找到我的查询,我想 return 它上方最近的标题。这是我自己试过的表达方式:

import re
query = "ABCDE"
full_text = "%EFGHI\r>XXXXX\r>XXXXX\r%IWANT\r>XXXXX\r>ABCDE"
re.search("%(.*?)\r(?=>.*{})".format(query), full_text).group(0)

我希望此代码块 return 字符串:

> 'IWANT'

因为这是查询上方最接近的标题。但是,它 returns:

> 'EFGHI'

我想这是有道理的,因为 'EFGHI' 是匹配搜索模式的第一个元素。有没有一种方法可以先向前查找我的查询,然后再向后查找最近的标题?

我建议将 \r>... 的所有部分与 ABCDE 值之前的 \r 之后没有 % 的部分匹配以获得正确的标题:

r"%([^\r]*)(?=(?:\r(?!%)[^\r]*)*\r>[^\r]*{})".format(query)

Python demo

图案详情:

  • % - 一个 % 字符
  • ([^\r]*) - 第 1 组:CR 字符以外的零个或多个字符
  • (?=(?:\r(?!%)[^\r]*)*\r>[^\r]*ABCDE) - 正向前瞻,紧靠当前位置的右侧,必须匹配以下模式序列:
    • (?:\r(?!%)[^\r]*)* - 0 次或多次重复的 CR 后面没有跟 %,然后跟着零个或多个 CR 字符以外的字符
    • \r> - CR 字符和 >
    • [^\r]* - 除 CR 字符外的零个或多个字符
    • ABCDE - 文字字符序列