【问题标题】:Extract text with conditions in Python在 Python 中提取带有条件的文本
【发布时间】:2018-08-24 11:31:02
【问题描述】:

我进行了很多研究,但找不到可以在以下条件下实现所需文本的正则表达式。

我有一大段文字,我想在一定条件下提取文字:

  1. 提取的文本应以单词列表开头。例如:苹果、香蕉、橙子、菠萝。
  2. 它应该以遇到其他三个单词中的任何一个并且前面有数字时结束。
  3. 只有在前面有数字时才应该开始提取。

示例文本:

我的包里有 2 个苹果,苹果是很好的食物。你嘘 每天吃苹果。这对健康非常有益。 3根香蕉也不错。 它可以减少脂肪。

以下是例外输出

我包里的苹果和苹果很棒......对健康有益。

香蕉也不错。它可以减少脂肪

所以,如果存在 2 个关键字,我希望创建 2 个文件,依此类推。

我尝试过的更新:

我尝试的正则表达式是:

(?=(\d+)(\s?)apple)(.*)(?=\d+\s?banana:?s)

Regex I tried

我有两个问题:

  1. 在提取的文本中我不想要第一个数字

  2. 如果我有 4 个单词,如何使其动态化,我不必编写那么多组合,如果我们正在搜索苹果,则提取的文本保存在该变量中

Python 版本:3.5

你能帮我用一个正则表达式吗?

【问题讨论】:

  • 如果您反对,请提供重复的问题。我很高兴删除这个问题,因为我已经完成了我的分析并且我是正则表达式的新手
  • 您之所以被否决,是因为您没有尝试过任何代码,并希望整个代码由其他人编写。阅读正则表达式并花一些精力编写代码,然后如果您遇到困难,请回到这里并寻求解决方案。
  • @serbia99:添加了我到目前为止所尝试的内容
  • 断章取意,单个正则表达式不是 "... 编写代码的一些努力...:,至少在我的书中没有。你已经读过minimal reproducible example?
  • 老实说,整个事情都是关于一个好的正则表达式,这就是我正在尝试和发布的内容

标签: python regex python-3.x


【解决方案1】:

试试这个:\d+\s*((?:Apple|Banana|Orange|Pineapple)s?\b[\s\S]*?)(?=$|\d+\s*(?:Apple|Banana|Orange|Pineapple)s?\b)

见:

Regex demo

代码:

import re

regex = r"\d+\s*((?:Apple|Banana|Orange|Pineapple)s?\b[\s\S]*?)(?=$|\d+\s*(?:Apple|Banana|Orange|Pineapple)s?\b)"

test_str = "I have 2 apples in my bag and apples are great food toeat. you shud eat apples daily. it is very good for health. 3 bananas are also good. it reduces fat."

matches = re.findall(regex, test_str, re.MULTILINE | re.IGNORECASE)

for match in matches: print(match + "\n")

code demo

注意:我假设您希望停止匹配换行符。如果不是这种情况,您可以删除 re.MULTILINE 标志,以便 $ 匹配字符串结尾。

【讨论】:

  • 它很好用,唯一的问题是如果我将字符串更改为“我的包里有 2 个苹果和 1 个苹果.....xx ...”,那么它会匹配。我正在寻找我们是否正在寻找苹果,它只有在获得苹果以外的任何东西时才会匹配
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多