我想要一个正则表达式,找到"包裹"在"HEAD或HEADa"和"HEAD"之间的文本.也就是说,我可能有一个以第一个单词开头的文本作为HEAD或HEADa以及下面的"head" "属于HEAD类型.
HEAD\n\n text...text...HEAD \n\n text....text HEAD\n\n text....text .....HEADa\n\n text...text...HEAD \n\n text....text HEAD\n\n text....text .....我只想捕获"头部"之间的文本,因此我有一个背后的正则表达式,并向前看表达式寻找我的"头".我有以下正则表达式:
var = "HEADa", "HEAD"
my_pat = re.compile(r"(?<=^\b"+var[0]+r"|"+var[1]+r"\b) \w*\s\s(.*?)(?=\b"+var[1] +r"\b)",re.DOTALL|re.MULTILINE)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试执行此正则表达式时,我收到一条错误消息,指出我在后面的表达式中不能有可变长度.这个正则表达式有什么问题?
Ala*_*ore 14
目前,你的正则表达式的第一部分看起来像这样:
(?<=^\bHEADa|HEAD\b)
Run Code Online (Sandbox Code Playgroud)
你有两种选择; 一个匹配五个字符,另一个匹配四个,这就是你得到错误的原因.一些正则表达式的风格会让你这样做,即使他们说他们不允许可变长度的lookbehinds,但不允许Python.您可以将其分解为两个lookbehinds,如下所示:
(?:(?<=^HEADa\b)|(?<=\bHEAD\b))
Run Code Online (Sandbox Code Playgroud)
......但是你可能不需要为了这个而需要lookbehinds.试试这个:
(?:^HEADa|\bHEAD)\b
Run Code Online (Sandbox Code Playgroud)
无论(.*?)后者如何匹配,仍然可以通过组#1获得.如果你真的需要整个分隔符之间的文本,您可以捕获该组#1,和其他集团将成为#2(或者你可以使用命名组,而不必跟踪号码).
一般来说,lookbehind永远不应该是你的第一手段.对于这项工作来说,这似乎是一个显而易见的工具,但通常情况下,通过直接匹配并使用捕获组提取所需的部分通常会更好.所有风味都是如此,而不仅仅是Python; 只是因为你可以用其他口味的外观做更多的事情并不意味着你应该这样做.
顺便说一句,您可能已经注意到我重新分配了您的单词边界; 我认为这是你真正想要的.