我想要一个正则表达式,找到“包裹”在“HEAD或HEADa”和“HEAD”之间的文本。也就是说,我可能有一个以第一个单词作为HEAD或HEADa开头的文本以下“头”是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)
但是,当我尝试执行此正则表达式时,我收到一条错误消息,指出我在后面的表达式中不能有可变长度。这个正则表达式出了什么问题?
答案 0 :(得分:14)
目前,正则表达式的第一部分如下所示:
(?<=^\bHEADa|HEAD\b)
你有两种选择;一个匹配五个字符,另一个匹配四个,这就是你得到错误的原因。一些正则表达式的风格会让你这样做,即使他们说他们不允许可变长度的lookbehinds,但不允许Python。你可以将其分解为两个看守,如:
(?:(?<=^HEADa\b)|(?<=\bHEAD\b))
......但是你可能不需要为了这个而需要lookbehinds。试试这个:
(?:^HEADa|\bHEAD)\b
以后(.*?)
匹配的任何内容仍然可以通过组#1获得。如果您确实需要分隔符之间的整个文本,则可以捕获组#1中的 ,并且其他组将变为#2(或者您可以使用命名组,而不必保留追踪数字。)
一般来说,lookbehind永远不应该是你的第一手段。对于这项工作来说,这似乎是一个显而易见的工具,但通常情况下,您最好不要进行直接匹配并使用捕获组提取所需的部分。所有风味都是如此,而不仅仅是Python;仅仅因为可以使用其他版本的lookbehinds做更多事情并不意味着你应该。
顺便说一下,您可能已经注意到我重新分配了您的单词边界;我认为这是你真正想要的。