我正在尝试使用正则表达式来查找字符串中括号之间的特定字符串,如下所示:
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)
。
我尝试了lookahead
和lookbehind
,但无法获得正确的结果。
例如,当我执行以下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)']
答案 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