python - 正则表达式:正确匹配具有负面回顾的组

标签 python regex

我正在处理这个字符串:

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(daynight)

如何调整正则表达式,而不是将 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']

RegEx Demo

关于python - 正则表达式:正确匹配具有负面回顾的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41600963/

相关文章:

javascript - 至少包含 1 个数字和 1 个字符且固定长度为 11 的字母数字字符串的正则表达式

正则表达式: "(.)+\1"如何工作?

javascript - 这场比赛为何失败?

Java 正则表达式字符串 : Check if ip:port string contains a valid IPv4 or DNS address

python - "input"是用作参数名称(在 PyTorch 中)时会导致错误的关键字吗?

python - 将PIL图像对象上传到Amazon s3 python

python - 在 python 2.3 上,Windows 执行具有多个参数和路径空格的程序(如 ghostscript)的最佳方法是什么?

python - numpy.load() 错误的魔术字符串错误

python - 循环时使用键对字典项目进行排序

javascript - 如何为 id 验证编写正则表达式(JavaScript)?