首先先行然后寻找前行匹配后面最接近的匹配捕获组。 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)
图案详情:
%
- 一个 %
字符
([^\r]*)
- 第 1 组:CR 字符以外的零个或多个字符
(?=(?:\r(?!%)[^\r]*)*\r>[^\r]*ABCDE)
- 正向前瞻,紧靠当前位置的右侧,必须匹配以下模式序列:
(?:\r(?!%)[^\r]*)*
- 0 次或多次重复的 CR 后面没有跟 %
,然后跟着零个或多个 CR 字符以外的字符
\r>
- CR 字符和 >
[^\r]*
- 除 CR 字符外的零个或多个字符
ABCDE
- 文字字符序列
我有一个包含换行字符串的全文。以“%”开头的行是标题,以“>”开头的行包含我要在其中查找我的查询的文本。如果找到我的查询,我想 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)
图案详情:
%
- 一个%
字符([^\r]*)
- 第 1 组:CR 字符以外的零个或多个字符(?=(?:\r(?!%)[^\r]*)*\r>[^\r]*ABCDE)
- 正向前瞻,紧靠当前位置的右侧,必须匹配以下模式序列:(?:\r(?!%)[^\r]*)*
- 0 次或多次重复的 CR 后面没有跟%
,然后跟着零个或多个 CR 字符以外的字符\r>
- CR 字符和>
[^\r]*
- 除 CR 字符外的零个或多个字符ABCDE
- 文字字符序列