2024-09-28 05:22:51 发布
网友
我有一个格式为
sjaskdjajldlj_abc: cdf_asjdl_dlsf1: dfsflks %jdkeajd sdjfls: adkfld %dk_.(%sfj)sdaj, %kjdflajfs afjdfj _ajhfkdjf zjddjh -15afjkkd xyz
我想找到第一行的字符串_abc:和最后一行的xyz之间的文本。 我已经试过打印了
_abc:
xyz
但我得到了null。在
null
当模式包含特殊字符时,您在其上使用了re.escape,因此它无法工作。在
re.escape
>>>>re.escape("*_abc:") '\\*_abc\\:'
{cd2>你想要的不是这个短语。在
拿着这个重新逃逸它应该或多或少正常工作。在
如果我正确理解要求:
a1=re.search(r'_abc(.*)xyz',line,re.DOTALL) print a1.group(1)
使用雷多尔这将启用。以匹配换行符。在
听起来您对*符号在正则表达式中的含义有误解。它的意思不是“匹配任何内容”,而是“重复前面的内容零次或多次”。在
*
要匹配任何字符串,您需要将*与{}组合起来,这将匹配任何单个字符(稍后将详细介绍)。模式.*匹配任何零个或多个字符的字符串。在
.*
所以,你可以把你的模式改成.*abc(.*)xyz,这样你就可以做到了。但是,如果前缀和后缀在文本中只存在一次,那么前导.*就不需要了。您可以省略它,让正则表达式引擎处理跳过abc前缀之前的任何不匹配字符。在
.*abc(.*)xyz
abc
剩下的一个问题是源文本中有多行文本。我在上面提到了.模式与字符匹配,但这并不完全正确。默认情况下,它与换行符不匹配。对于单行文字,这无关紧要,但这会给你带来麻烦。要改变这种行为,可以将标志re.DOTALL(或其缩写,re.S)作为第三个参数传递给re.findall或{}。该标志告诉正则表达式系统允许.模式匹配任何字符,包括换行符。在
.
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
我把模式简化了一点,因为你的评论建议你要得到整个匹配的文本,而不仅仅是前缀和后缀之间的部分。在
当模式包含特殊字符时,您在其上使用了
re.escape
,因此它无法工作。在{cd2>你想要的不是这个短语。在
拿着这个重新逃逸它应该或多或少正常工作。在
如果我正确理解要求:
使用雷多尔这将启用。以匹配换行符。在
听起来您对
*
符号在正则表达式中的含义有误解。它的意思不是“匹配任何内容”,而是“重复前面的内容零次或多次”。在要匹配任何字符串,您需要将}组合起来,这将匹配任何单个字符(稍后将详细介绍)。模式
*
与{.*
匹配任何零个或多个字符的字符串。在所以,你可以把你的模式改成
.*abc(.*)xyz
,这样你就可以做到了。但是,如果前缀和后缀在文本中只存在一次,那么前导.*
就不需要了。您可以省略它,让正则表达式引擎处理跳过abc
前缀之前的任何不匹配字符。在剩下的一个问题是源文本中有多行文本。我在上面提到了}。该标志告诉正则表达式系统允许
.
模式与字符匹配,但这并不完全正确。默认情况下,它与换行符不匹配。对于单行文字,这无关紧要,但这会给你带来麻烦。要改变这种行为,可以将标志re.DOTALL
(或其缩写,re.S
)作为第三个参数传递给re.findall
或{.
模式匹配任何字符,包括换行符。在下面是如何将当前代码转换为工作系统:
我把模式简化了一点,因为你的评论建议你要得到整个匹配的文本,而不仅仅是前缀和后缀之间的部分。在
相关问题 更多 >
编程相关推荐