【问题标题】:Find text between list of keywords and point with RegEx in Python在 Python 中使用 RegEx 查找关键字列表和指向之间的文本
【发布时间】:2018-07-25 08:10:24
【问题描述】:
# coding=utf-8
import re

m = "Hola esto es un ejemplo Objeto: esta es una de, las palabras."

keywords = ['Objeto:', 'OBJETO', 'Objeto social:', 'Objetos']

obj = re.compile(r'\b(?:{})\b\s*(.*?),'.format('|'.join(map(re.escape, keywords))))
print obj.findall(m)

我想在关键字的一个单词和下一点之间打印文本。在这些情况下我想要的输出:“esta es una de, las palabras。”

【问题讨论】:

  • 由于您的关键字是多词条目的列表,甚至是空格分隔的,并且它们重叠,您应该考虑通过首先按长度按降序对项目进行排序来构建交替,正如我展示的@ 987654321@。否则,您可能会在结果中看到不需要的文本。
  • 哦,完美。这个解决方案比我的要优化得多。谢谢! :)
  • 好吧,我仍然不确定单词边界。可能您需要真正丢弃 Jean-Francois 使用的右侧边界。

标签: python regex keyword


【解决方案1】:

结尾的 \b 会阻止匹配,因为您的关键字以 : 结尾

通过删除它来简化您的正则表达式。加上贪婪/逗号(.*?), 只是提取逗号之前的第一部分,我想你的意思是“到下一点”:(.*?)\.

obj = re.compile(r'\b(?:{})\s*(.*?)\.'.format('|'.join(map(re.escape, keywords))))

结果:

['esta es una de, las palabras']

去除单词边界可以匹配句子中的部分关键字。之后您可以强制使用\W 使用非单词字符,它会起作用(就像单词边界一样):

obj = re.compile(r'\b(?:{})\W\s*(.*?)\.'.format('|'.join(map(re.escape, keywords))))

【讨论】:

  • 预期输出包括, las palabras.,不是吗?
  • 是的,但要整句话切中要害。喜欢:esta es una de, las palabras
  • 是的,我希望我的输出是 ['esta es una de, las palabras']
  • @AnnaCastan 尝试将正则表达式代码更改为 \b(?:{})\s*(.*?)\.
  • @marco_gorelli 完全正确!!非常感谢大家:) :)
【解决方案2】:

使用\b(?:{0})\s*(.*?)(?=\b(?:{0})|$) 代替前瞻:

import re
m = "Hola esto es un ejemplo Objeto: esta es una de, las palabras."
keywords = ['Objeto:', 'OBJETO', 'Objeto social:', 'Objetos']
obj = re.compile(r'\b(?:{0})\s*(.*?)(?=\b(?:{0})|$)'.format('|'.join(map(re.escape, keywords))))
print(obj.findall(m))

这个输出:

['esta es una de, las palabras.']

【讨论】:

  • 这个答案也很好用!!非常感谢@blhsing :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2016-01-27
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多