[英]Python non-greedy regular expression is not exactly what I expected
字符串:XXaaaXXbbbXXcccXXdddOO
我想匹配以'XX'开头和'OO'结尾的最小字符串。
所以我写了一个非贪婪的reg:r'XX。*?OO'
>>> str = 'XXaaaXXbbbXXcccXXdddOO'
>>> re.findall(r'XX.*?OO', str)
['XXaaaXXbbbXXcccXXdddOO']
我以为它将返回['XXdddOO'],但它是如此“贪婪”。
然后我知道我一定弄错了,因为上面的限定词将首先匹配“ XX”,然后显示为“非贪婪”。
但是我仍然想弄清楚如何才能直接获得结果['XXdddOO'] 。 任何答复表示赞赏。
到现在为止,关键点实际上并不是关于非贪婪的问题,或者换句话说,是关于我眼中的非贪婪的问题:它应该在左限定词(XX)和右限定词( OO)。当然,事实是字符串是从左到右处理的。
怎么样:
.*(XX.*?OO)
比赛将在第1组中。
确实,问题不是贪婪/非贪婪……@devnull建议的解决方案应该可以工作,只要您要避免在XX
和OO
组之间使用单个X即可。
否则,您将不得不使用前瞻功能(即一条正则表达式,它将“侦听”前面的字符串,并检查它是否可以实现,但实际上不消耗任何字符)。 像这样:
re.findall(r'XX(?:.(?!XX))*?OO', str)
通过此负前瞻,您可以(非贪婪地)匹配不跟XX
任何字符( .
)。
正则表达式从左到右运行:非贪婪意味着它将匹配XXaaaXXdddOO
而不匹配XXaaaXXdddOOiiiOO
。 如果您的数据结构是固定的,则可以执行以下操作:
XX[a-z]{3}OO
选择XXiiiOO
类的所有模式(可以根据您的需要进行调整,例如使用XX[^X]+?OO
选择从OO
到该OO
的最后XX
对之间的所有内容:例如在XXiiiXXdddFFcccOOlll
匹配XXdddFFcccOO
)
该行为是由于该字符串是从左到右处理的事实。 避免此问题的一种方法是使用否定的字符类:
XX(?:(?=([^XO]+|O(?!O)|X(?!X)))\1)+OO
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.