首页 > 解决方案 > 仅提取括号内的特定单词

问题描述

我只想提取括号内的特定单词。例如,如果我有一个单词列表 ['foo', 'bar'] 和一个字符串“alpha bravo (charlie foo bar delta) foxtrot”,我想通过提取得到“alpha bravo foo bar foxtrot”。我已经尝试过但失败了。

word_list = ['foo', 'bar']
string = 'alpha bravo (charlie foo bar delta) foxtrot'
print(re.sub(r"\([^()]*\b({})\b[^()]*\)".format('|'.join(word_list)), r'\1', string, flags = re.I))

我希望得到“alpha bravo foo bar foxtrot”,但结果是“alpha bravo bar foxtrot”。你想告诉我如何解决这个问题吗?

标签: pythonregexextractparenthesesbrackets

解决方案


这是使用re.sub回调逻辑的基于正则表达式的方法:

word_list = ['foo', 'bar']
regex = r'\b(?:' + '|'.join(word_list) + r')\b'         # \b(?:foo|bar)\b
string = 'alpha bravo (charlie foo bar delta) foxtrot'
def repl(m):
    if m.group(1):
        return ' '.join(re.findall(regex, m.group(1)))
    else:
        return m.group(0)

print(re.sub(r'\((.*?)\)|\w+', repl, string))

这打印:

alpha bravo foo bar foxtrot

作为解释,我们对以下模式进行全局正则表达式搜索:

\((.*?)\)|\w+

这将首先尝试匹配括号中的任何术语。如果找到这样的匹配,它将把整个匹配传递给回调函数repl()。此回调函数将re.findall在您的单词列表中使用,以仅保留括号中您想要的匹配项。否则,上面的正则表达式一次只能找到一个单词。


推荐阅读