我有一个全文,用行分隔的字符串。以'%'开头的行是标题,以'>'开头的行包含我要在其中查找查询的文本。如果找到我的查询,我想返回其上方最近的标题。这是我尝试过的表情:
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”是第一个与搜索模式匹配的元素。有没有一种方法可以先查询我的查询,然后再查找最近的标题?
答案 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
-文字字符序列