仅提取括号内的特定单词

2024-09-28 17:01:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想提取括号内的特定单词。例如,如果我有一个单词列表['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))

我本想得到“阿尔法-布拉沃-巴狐步舞”,但结果是“阿尔法-布拉沃-巴狐步舞”。 你能告诉我怎么解决这个问题吗


Tags: alphare列表stringfoobar单词list
2条回答

这是我自制的食谱

import re
word_list = ['foo', 'bar']
string = 'alpha bravo (charlie foo bar delta) foxtrot'
string = re.split('\(|\)',string)
text = [string[0],string[2]]
count = 0
for elements in string[1].split():
    if elements in word_list:
        count += 1
        text.insert(count,elements+' ')
print(''.join(text))          

下面是一种基于正则表达式的方法,使用带有回调逻辑的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,仅保留括号中所需的匹配项。否则,上面的正则表达式一次只能找到一个单词

相关问题 更多 >