Python中的可变宽度查找问题

Python中的可变宽度查找问题,python,regex,lookbehind,negative-lookahead,Python,Regex,Lookbehind,Negative Lookahead,我得到了以下场景: 1) car on the right shoulder 2) car on the left shoulder 3) car on the shoulder 当左|右不存在时,我想匹配“肩部”。所以只有3)返回“肩膀” 重新编译(r’(?)? 我怎样才能解决这个问题 提前感谢!在大多数正则表达式引擎中,lookbehind需要具有固定的宽度。这意味着您不能在Python中的lookbehind中使用量词+*?。解决方案是将\s*移到lookbehind之外: (?<

我得到了以下场景:

1) car on the right shoulder
2) car on the left shoulder
3) car on the shoulder
当左|右不存在时,我想匹配“肩部”。所以只有3)返回“肩膀”

重新编译(r’(?)? 我怎样才能解决这个问题


提前感谢!

在大多数正则表达式引擎中,lookbehind需要具有固定的宽度。这意味着您不能在Python中的lookbehind中使用量词
+*?
。解决方案是将
\s*
移到lookbehind之外:

(?<!left|right)\s*shoulder
此解决方案的唯一问题是,如果它位于字符串的开头,它将找不到
肩部
,因此我们可能会添加一个带有锚点的替代方案:

^shoulder|(?<!left|right)\s+shoulder
^肩|(?
如果你想去掉空白,只需使用strip函数

regex
模块:可变宽度查找 除此之外,对于Python中任何复杂的正则表达式,我建议使用杰出的。它支持无限查找引擎,与.NET和JGSoft一起使用,这是为数不多的引擎之一

这允许您执行以下操作,例如:

import regex
if regex.search("(?<!right |left )shoulder", "left shoulder"):
    print("It matches!")
else:
    print("Nah... No match.")

通过将固定宽度正向后视与反向前视相结合,可以避免对可变宽度后视的需要:


re.split(')(?regex.compile(r')(?@EdwardWang不确定你那边发生了什么,但这里@HamZa你误解了我的问题。当右/左出现在“肩膀”之前时,我希望不匹配。但您的解决方案仍然返回肩部,与r'/b肩部/b'@EdwardWang没有什么不同。您检查过我链接的图像吗?当有“右”或“左”时,它不会返回“肩部”背后。+1用于伟大的regex模块链接。我们有类似的东西可用于PHP吗?@anubhava谢谢。在PHP中,我不知道另一个引擎,你知道无限查找的常见解决方法,
\K
在某些情况下,在其他情况下捕获组。非常感谢伟大的regex链接。regex模块支持无限查找当我需要使用regex
r'(?
^shoulder|(?<!left|right)\s+shoulder
import regex
if regex.search("(?<!right |left )shoulder", "left shoulder"):
    print("It matches!")
else:
    print("Nah... No match.")
It matches!