使用Regex进行数据提取

时间:2015-06-10 10:05:20

标签: regex data-extraction

我在文件文件“file.txt”中有数据

  

食谱&菜单
  专家意见
  成分
  假期&活动
  社区
  视频
  夏季烹饪
  扁豆和糙米汤
  美食1991年1月
  3.5 / 4
  评论(83)
  90%
  再做一次   有些汤确实能激发出类似爱情的奉献精神,这就是他们中的一员。在寒冷的冬天,当美食编辑思考什么汤   库克
  评论(83)
  产量:大约14杯,服务6到8个   的成分
  5杯鸡汤   1 1/2杯扁豆,挑选并冲洗   1杯糙米
  西红柿32至35盎司,排干,保留果汁,切碎   3个胡萝卜,纵向减半,横切成1/4英寸的坯料   1个洋葱,切碎的
  1根芹菜,切碎的
  3个蒜瓣,切碎
  1/2茶匙碎干的罗勒
  1/2茶匙粉碎干燥的orégano
  1/4茶匙粉碎干百里香
  1月桂叶
  1/2杯切碎的新鲜欧芹叶
  2汤匙苹果醋,或品尝
  的制备
  在一个沉重的水壶中加入肉汤,3杯水,扁豆,米饭,西红柿和预留的汁液,

我想在成分准备之间提取数据 我写了以下正则表达式: -

(?s).*?Ingredients(.*?)Preparation.*

但它正在提取成分之间的数据以斜体显示在第3行的file.txt和准备但不在成分之间的数据之间准备
我应该对我的正则表达式代码进行哪些更改来解决此问题?
提前谢谢!

4 个答案:

答案 0 :(得分:2)

您可以使用延迟量词.*?和第二个.*

(?s).*\bIngredients\b(.*?)\bPreparation\b

请参阅demo

或者您可以使用tempered greedy token,然后您不需要第一个.*

(?s)\bIngredients\b(?:(?!\b(?:Ingredients|Preparation)\b).)*\bPreparation\b

请参阅demo

答案 1 :(得分:1)

(?s).*?[*]{2}Ingredients[*]{2}(.*?)[*]{2}Preparation[*]{2}.*

[*]{2}告诉正则表达式你想要列表中的一个字符(这里只有一个*)两次{2}

我更喜欢使用字符类而不是转义,我发现它们比这更具可读性:

(?s).*?\*{2}Ingredients\*{2}(.*?)\*{2}Preparation\*{2}.*

并且根据您使用的语言,您可能也必须逃避反斜杠。

答案 2 :(得分:1)

您可以使用前瞻检查每行不是Ingredients。通过这种方式,您可以将测试次数限制为仅仅行的开头(而不是测试每个字符):

(?m)^Ingredients\R((?:(?!Ingredients$).*\R)+?)Preparation$ 

demo

模式细节:

(?m)             # switch on the multiline mode (^ and $ match the limit of the line)
^Ingredients\R   # "Ingredients" at the start of the line followed by a new line
(   # capture group 1
    (?:          # open a non-capturing group
        (?!Ingredients$) # negative lookahead to check that the line is not "Ingredients"
        .*\R             # the line
    )+? # repeat until "Preparation"
)
Preparation$

注意:由于您没有说明您使用的是什么正则表达式引擎,因此可能不支持\R。在这种情况下,请将其替换为\r?\n

答案 3 :(得分:1)

尝试让你的第一个.*贪婪。直到Ingredients之前的最后一个Preparation,它将全部吃掉(?s).*Ingredients(.*?)Preparation.*

String

演示:https://regex101.com/r/mQ5eK5/1