首先进行前瞻,然后在前瞻匹配项之后寻找最接近的匹配捕获组。 Python中的RegEx

时间:2018-12-17 10:39:51

标签: python regex regex-lookarounds regex-group

我有一个全文,用行分隔的字符串。以'%'开头的行是标题,以'>'开头的行包含我要在其中查找查询的文本。如果找到我的查询,我想返回其上方最近的标题。这是我尝试过的表情:

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)

我希望此代码块返回字符串:

> 'IWANT'

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

> 'EFGHI'

我想这很有意义,因为“ EFGHI”是第一个与搜索模式匹配的元素。有没有一种方法可以先查询我的查询,然后再查找最近的标题?

1 个答案:

答案 0 :(得分:3)

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

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-文字字符序列