【问题标题】:First lookahead then look for closest matching capture group behind the lookahead match. RegEx in Python首先前瞻,然后在前瞻匹配后面寻找最接近的匹配捕获组。 Python 中的正则表达式
【发布时间】:2018-12-17 10:39:51
【问题描述】:

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

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' 是匹配搜索模式的第一个元素。有没有办法先查找我的查询,然后再查找最近的标题?

【问题讨论】:

    标签: python regex regex-lookarounds regex-group


    【解决方案1】:

    我建议将所有在\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 - 文字字符序列

    【讨论】:

    • 我觉得更简单:r'%([^%>]+)[^%]*?\r>{}'.format(query)
    • @kantal 我看到您的变体正在工作,但我不确定XXX 部分不包含%>,而ABCDE 可能不必紧随其后>.
    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2020-04-15
    相关资源
    最近更新 更多