【问题标题】:Using regular expression to find specific strings between parentheses (including parentheses)使用正则表达式查找括号之间的特定字符串(包括括号)
【发布时间】:2016-02-06 01:02:02
【问题描述】:

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

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)']

【问题讨论】:

  • 建议:把引号里面的字符串全部找出来,然后用if 'W/O' in string过滤出你想要的字符串怎么样?

标签: python regex python-2.7 lookahead lookbehind


【解决方案1】:

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

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

>>> 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 我刚刚意识到问题出在哪里:在'(?&lt;=[\s\(])\([^\)].*\sW/O\s[^\)].*\)(?=[\)\s])',而不是[^\)].*,我应该使用[^\)]*
【解决方案2】:

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

re.findall(r'\([^()]* W/O [^)]*\)', foo)

【讨论】:

  • 感谢您的回答。我需要使用前瞻和后瞻,因为我不想匹配其他出现的模式,我在问题中没有提到
猜你喜欢
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多