使用正则表达式查找括号之间的特定字符串(包括括号)

时间:2016-02-06 01:02:02

标签: python regex python-2.7 lookahead lookbehind

我正在尝试使用正则表达式来查找字符串中括号之间的特定字符串,如下所示:

foo = '((peach W/O juice) OR apple OR (pear W/O water) OR kiwi OR (lychee AND sugar) OR (pineapple W/O salt))'

具体来说,我只想找到(peach W/O juice)(pear W/O water)(pineapple W/O salt)

我尝试了lookaheadlookbehind,但无法获得正确的结果。

例如,当我执行以下RegEx:

import re
regex = '(?<=[\s\(])\([^\)].*\sW/O\s[^\)].*\)(?=[\)\s])'
re.findall(regex, foo)

我最终得到了整个字符串:

['(peach W/O juice) OR apple OR (pear W/O water) OR kiwi OR (lychee AND sugar) OR (pineapple W/O salt)']

编辑:

我发现了问题:

而不是[\)].*,我应该[\)]*,这会给我正确的结果:

regex = '(?<=[\s\(])\([^\)]*\sW/O\s[^\)]*\)(?=[\)\s])'

re.findall(regex, foo)
['(peach W/O juice)', '(pear W/O water)', '(pineapple W/O salt)']

2 个答案:

答案 0 :(得分:3)

我认为您的问题是,您的.*运营商正在贪婪 - 如果您不在?之后,他们会尽可能多地消费:.*?。另请注意,由于您想要括号,因此您不需要前瞻/后瞻操作;他们会排除他们找到的括号。

我没有完全调试你的正则表达式,而是决定重写它:

>>> import re
>>> foo ='((peach W/O juice) OR apple OR (pear W/O water) OR kiwi OR (lychee AND sugar) OR (pineapple W/O salt))'
>>> regex = '\([a-zA-Z ]*?W/O.*?\)'
>>> re.findall(regex, foo)
['(peach W/O juice)', '(pear W/O water)', '(pineapple W/O salt)']

以下是细分:

\(捕获主要括号 - 请注意它已转义

[a-zA-Z ]捕获所有字母字符和空格(注意结束括号前Z之后的空格)我使用此代替.,以便不会捕获其他括号。使用句点运算符会导致(lychee AND sugar) OR (pineapple W/O salt)被捕获为一个匹配项。

*? *会导致括号中的字符匹配0次或更多次,但?的说法只能捕获匹配所需的数量

W/O捕获您正在寻找的“W / O”

.*?捕获更多字符(再次,由于?而非贪婪)

\)捕获尾随的括号

答案 1 :(得分:1)

由于您希望在结果中包含括号,因此您不需要使用外观。您可以使用排除右括号的字符类。这样,您可以确定W / O在括号之间:

l->name