Python:正则表达式忽略包含特定单词的文本

3
我有以下文本,存储在一个名为“字典条目”的词典中。
info['growing_info']

萝卜需要疏松、排水良好、pH值在5.8-6.8的土壤。从早春开始,可以在任何时候播种。使用2-3英寸宽的带状区域,种植间距约为3/4-1英寸(除了624号红肉和616号Nero Tondo每英尺35颗种子以外,每英尺10颗种子),深度为1/2英寸,行距为1英尺或任何可以消除未种植地面来防止杂草生长的行或基床计划。萝卜对炎热干燥的天气不利。它们只保持最佳状态几天,应快速生长并充分获得水分才能变得温和、柔嫩和有吸引力。如果生长受阻,根可能会变得坚硬、纤维质和过于辛辣。请提供一个正则表达式返回...
>>>seed_spacing.group(1)
>>>1
>>>seed_spacing.group(2)
>>>"

我的当前尝试是

seed_spacing = re.search(r'(?:Sow|sow|transplant|Transplant).+(?!rows).+([\d]+)(\'|") apart',info['growing_info'])

我的代码并没有返回我想要的结果。我知道过度使用“点”字符是有害的,但我不确定该怎么做。


你的字符串中有 rows 1' apart,但没有任何 rows 1" apart。你希望正则表达式如何获取 1" 而不是 1' - abarnert
1
如果 ' 是正确的,就像它看起来的那样... 那么你的代码已经可以工作了。 - abarnert
我想要去除行间距,只捕捉种子间距。 - buck54321
所以你想让3/4-1"被报告为1",如果你找到了1/2-3/4",你希望它被报告为4" - abarnert
@abarnert 很好的观点。谢谢。 - buck54321
2个回答

4
你可以使用这个正则表达式:
re.search(r'(?:sow|transplant).+?(\d+)(\'|") apart', info['growing_info'], re.I)

regex101演示

我进行了一些修改,具体如下:

  • 添加了忽略大小写标志,这样你就可以使用(?:sow|transplant)
  • 删除了(?!rows).+;它没有起到任何作用,并将.+更改为.+?以进行懒惰匹配。

如果你绝对避免在匹配文本中出现rows,请使用以下内容:

re.search(r'(?:sow|transplant)(?:(?!rows).)+(\d+)(\'|") apart', info['growing_info'], re.I)

(?:(?!rows).)将匹配除rows之外的任何字符。


.+(?!rows).+

由于(?!rows)未检查与任何.+匹配的每个字符,因此不起作用。以下是它的工作方式(粗体部分表示到目前为止已匹配的内容):
  1. 正则表达式尝试匹配 (?:sow|transplant) 并成功匹配

    萝卜需要疏松、排水良好,pH值在5.8-6.8的土壤。可以在整个季节任何时候播种,从早春开始。使用2-3英寸宽的带子,每颗种子之间相距约3/4-1英寸(除624 Red Meat和616 Nero Tondo外,每英尺大约35粒种子,10英尺除外),深度为1/2英寸,行距为1英尺,也可以使用任何行距或床上种植方案,以消除未种植的土地,以防止杂草生长。萝卜对炎热干燥的天气不利。它们只保持最佳状态几天,并且应该在大量湿度下快速生长,才能变得温和、嫩美。如果生长停滞,根可能变得坚韧、木质、过于辛辣。

  2. 接下来是.+,这意味着匹配每个字符(贪婪):

    萝卜需要疏松、排水良好,pH值在5.8-6.8的土壤。可以在整个季节任何时候播种,从早春开始。使用2-3英寸宽的带子,每颗种子之间相距约3/4-1英寸(除624 Red Meat和616 Nero Tondo外,每英尺大约35粒种子,10英尺除外),深度为1/2英寸,行距为1英尺,也可以使用任何行距或床上种植方案,以消除未种植的土地,以防止杂草生长。萝卜对炎热干燥的天气不利。它们只保持最佳状态几天,并且应该在大量湿度下快速生长,才能变得温和、嫩美。如果生长停滞,根可能变得坚韧、木质、过于辛辣。

  3. 接下来是(?!rows)。正则表达式检查并发现末尾没有rows

  4. 接下来是.+。正则表达式必须回溯一个字符才能允许此匹配:

    萝卜需要疏松、排水良好,pH值在5.8-6.8的土壤。可以在整个季节任何时候播种,从早春开始。使用2-3英寸宽的带子,每颗种子之间相距约3/4-1英寸(除624 Red Meat和616 Nero Tondo外,每英尺大约35粒种子,10英尺除外),深度为1/2英寸,行距为1英尺,也可以使用任何行距或床上种植方案,以消除未种植的土地,以防止杂草生长。萝卜对炎热干燥的天气不利。它们只保持最佳状态几天,并且应该在大量湿度下快速生长,才能变得温和、嫩美。如果生长停


    (?:(?!rows).)
    

    这是目前的工作原理:
    1. 正则表达式试图匹配(?:sow|transplant),并成功匹配:

      萝卜需要疏松、排水良好、pH值在5.8-6.8的土壤。 在任何时候播种,从早春开始。使用2-3英寸宽的带子,将种子间隔约3/4-1英寸(每英尺约35颗种子,除624 Red Meat和616 Nero Tondo外,每英尺10颗种子),深度为1/2英寸,行距为1英尺,或者使用任何能消除未种植地面以防止杂草生长的行或垫芯方案。萝卜受炎热干燥的天气不利。它们只能在最佳状态下保持几天,应该快速生长,有足够的湿度,才能变得温和、嫩美。如果生长被阻碍,根部可能会变得坚韧、空心且味道过于辛辣。

    2. 接下来是(?:(?!rows).),这表示匹配一个字符,并确保该字符之后没有rows(假设用+表示匹配了两个字符,因为空格无法加粗):

      萝卜需要疏松、排水良好、pH值在5.8-6.8的土壤。 在任何时候播种,从早春开始。使用2-3英寸宽的带子,将种子间隔约3/4-1英寸(每英尺约35颗种子,除624 Red Meat和616 Nero Tondo外,每英尺10颗种子),深度为1/2英寸,行距为1英尺,或者使用任何能消除未种植地面以防止杂草生长的行或垫芯方案。萝卜受炎热干燥的天气不利。它们只能在最佳状态下保持几天,应该快速生长,有足够的湿度,才能变得温和、嫩美。如果生长被阻碍,根部可能会变得坚韧、空心且味道过于辛辣。

      由于没有rows,所以重复此分组。这将一直持续到:

      萝卜需要疏松、排水良好、pH值在5.8-6.8的土壤。 在任何时候播种,从早春开始。使用2-3英寸宽的带子,将种子间隔约3/4-1英寸(每英尺约35颗种子,除624 Red Meat和616 Nero Tondo外,每英尺10颗种子),深度为1/2英寸,行距为1英尺,或者使用任何能消除未种植地面以防止杂草生长的行或垫芯方案。萝卜受炎热干燥的天气不利。它们只能在最佳状态下保持几天,应该快速生长,有足够的湿度,才能变得温和、嫩美。如果生长被阻碍,根部可能会变得


哦,如果你需要一个完整的分数,你可能想把 (\d+) 改成 ([\d/]+) - Jerry
谢谢@Jerry。你能解释一下(?:(?!rows).)+和(?!rows)之间的区别吗? - buck54321
1
@buck54321 抱歉这段话有点长,但我认为没有比这更详细的描述了 :) - Jerry
我喜欢Regex101演示! :) - kame

-1

移除 \d 周围的方括号。


括号是不必要的,但它们并没有引起问题。两种方式的结果相同,请进行比较。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接