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))
我希望得到“alpha bravo foo bar foxtrot”,但结果是“alpha bravo bar foxtrot”。你想告诉我如何解决这个问题吗?
解决方案
这是使用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
在您的单词列表中使用,以仅保留括号中您想要的匹配项。否则,上面的正则表达式一次只能找到一个单词。
推荐阅读
- ruby-on-rails - rdkafka 0.8.1 错误:无法构建 gem 原生扩展
- angular - 出现错误:“mat-date-range-picker-actions”不是已知元素
- java - 谁能解释为什么这个程序显示 IllegalMonitorStateException?
- javascript - 未捕获的 TypeError:onPageChange 不是 Material UI 中 DataGrid 的函数
- ojdbc - 使用包含 rownum 的选择查询更新 ResultSet
- asp.net-mvc - 使用实体框架将数据保存到数据库后无法清除文本框值并打印成功消息
- javascript - Discord.js Send 在 unban 命令中未定义
- python - plot_confusion_matrix() 使用 sklearn 得到了一个意外的关键字参数“类”
- ios - 在返回之前获取 Observable 数组的计数
- javascript - 如何测试一个反应连接的组件以及测试什么组件?