在多行中查找两个关键字之间的大字符串序列

2024-09-28 05:22:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个格式为

sjaskdjajldlj_abc:  
cdf_asjdl_dlsf1:  
    dfsflks %jdkeajd  
sdjfls:  
    adkfld  %dk_.(%sfj)sdaj, %kjdflajfs  
    afjdfj _ajhfkdjf  
    zjddjh -15afjkkd  
    xyz  

我想找到第一行的字符串_abc:和最后一行的xyz之间的文本。 我已经试过打印了

^{pr2}$

但我得到了null。在


Tags: 格式abcdkcdfxyzadkflddlsf1sdjfls
3条回答

当模式包含特殊字符时,您在其上使用了re.escape,因此它无法工作。在

>>>>re.escape("*_abc:")
'\\*_abc\\:'

{cd2>你想要的不是这个短语。在

拿着这个重新逃逸它应该或多或少正常工作。在

如果我正确理解要求:

a1=re.search(r'_abc(.*)xyz',line,re.DOTALL)
print a1.group(1)

使用雷多尔这将启用。以匹配换行符。在

听起来您对*符号在正则表达式中的含义有误解。它的意思不是“匹配任何内容”,而是“重复前面的内容零次或多次”。在

要匹配任何字符串,您需要将*与{}组合起来,这将匹配任何单个字符(稍后将详细介绍)。模式.*匹配任何零个或多个字符的字符串。在

所以,你可以把你的模式改成.*abc(.*)xyz,这样你就可以做到了。但是,如果前缀和后缀在文本中只存在一次,那么前导.*就不需要了。您可以省略它,让正则表达式引擎处理跳过abc前缀之前的任何不匹配字符。在

剩下的一个问题是源文本中有多行文本。我在上面提到了.模式与字符匹配,但这并不完全正确。默认情况下,它与换行符不匹配。对于单行文字,这无关紧要,但这会给你带来麻烦。要改变这种行为,可以将标志re.DOTALL(或其缩写,re.S)作为第三个参数传递给re.findall或{}。该标志告诉正则表达式系统允许.模式匹配任何字符,包括换行符。在

下面是如何将当前代码转换为工作系统:

import re

def find_between(prefix, suffix, text):
    pattern = r"{}.*{}".format(re.escape(prefix), re.escape(suffix))
    result = re.search(pattern, text, re.DOTALL)
    if result:
        return result.group()
    else:
        return None # or perhaps raise an exception instead

我把模式简化了一点,因为你的评论建议你要得到整个匹配的文本,而不仅仅是前缀和后缀之间的部分。在

相关问题 更多 >

    热门问题