【问题标题】:How would I make this Regex expression more inclusive and accurate?如何使这个 Regex 表达式更具包容性和准确性?
【发布时间】:2019-04-10 02:19:00
【问题描述】:

我正在使用 python 2.7 在一段文本中查找文本。 以下文字是我摘录的一部分:

Item 1 for Product A: Flour
Solution 1 for Product A: Water
Items 2 for Product B: Milk
Solution 2 for Product B: Oil
Item 3 for Product C: Onions

Method

我有以下 Python 代码来提取我想要的特定信息:

extract = re.findall(r"(?<=Item|s\s).*(?=\sSolution)", page_content)

虽然这会提取一些信息,但我无法提取我需要的所有信息。 我需要包含“项目”这个词,但我无法提取最后一个项目,因为下一个词不是“解决方案”而是方法。

我想要的输出是:

Item 1 for Product A: Flour
Items 2 for Product B: Milk
Item 3 for Product C: Onions

在改进正则表达式方面的任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 每行末尾是否总是有换行符?
  • 不一定。实际上,当我使用 Python 库将 PDF 转换为文本时,输出文本会连接换行符,因此原始文本实际上是:产品 A 的项目 1:产品 A 的 FlourSolution 1:水等。

标签: python regex regex-lookarounds regex-group


【解决方案1】:

如果你的输入看起来像

Item 1 for Product A: FlourSolution 1 for Product A: WaterItems 2 for Product B: MilkSolution 2 for Product B: OilItem 3 for Product C: Onions

Method

以下模式为您提供所需的输出。

r'(Item[s]{0,1}.*?\:\s[A-Z][a-z]*[^A-Z])'

在这里查看: https://regex101.com/r/ucPdcV/2

【讨论】:

  • 感谢您的回复,我已将您的表达调整为另一个查询,请参阅链接:regex101.com/r/MySbqU/1 但是我看到它有点成功或错过 - 有什么建议吗?
  • @qbbq 上面的模式不适用于您的示例,因为它利用大写字母作为终止提示。如果您在链接中看到,则:Counsel 之间可能会夹有大写字母。我还没有找到一种正确区分的方法,但一种快速、肮脏的方法是在 Python 中手动获取整个短语和子 Counsel 与一个空字符串
  • 啊,这是一个很好的看待它的方式。非常感谢 - 你帮助我朝着正确的方向前进。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多