我正在处理这个字符串:
qr/I Love Chocolate|And Free Shipping|All (day|night)|please/i;
我正在使用以下正则表达式模式:
(?:qr\/)?(.*?)(?:\||\/)
我想找回以下比赛:
["I Love Chocolate", "And Free Shipping", "All (day|night)", "please"]
然而,这是我实际得到的:
["I Love Chocolate", "And Free Shipping", "All (day", "night)", "please"]
我修改了我的正则表达式以使用回顾:
(?:qr\/)?(?<!All \(day|night\))(.*?)(?:\||\/)
但是,这仍然会将字符串拆分为 All(day
和 night)
。
如何调整正则表达式,而不是将 All (day
and night)
捕获为单独的字符串,而是获取 All (day|night)
?
更一般地说,这里的目标用麻瓜的话来说是:“找到任何由竖线字符分隔的组,除非该组包含 1 个或多个被椭圆包围的竖线字符;在这种情况下,将整个字符串视为一个组”
最佳答案
您可以使用此正则表达式进行匹配:
[^/|(]+(?:\([^)]*\))*
代码:
>>> str = 'qr/I Love Chocolate|And Free Shipping|All (day|night)|please/i'
>>> print re.findall(r'[^/|(]+(?:\([^)]*\))*', str)
['qr', 'I Love Chocolate', 'And Free Shipping', 'All (day|night)', 'please', 'i']
或者如果你想丢弃开始的 qr/
和最后的 /i
然后使用:
>>> print re.findall(r'[^/|(]+(?:\([^)]*\))*', re.sub(r'^qr/(.*)/i$', r'\1', str))
['I Love Chocolate', 'And Free Shipping', 'All (day|night)', 'please']
关于python - 正则表达式:正确匹配具有负面回顾的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41600963/