【问题标题】:Variable length Lookbehinds RegEx don't works in Python可变长度 Lookbehinds RegEx 在 Python 中不起作用
【发布时间】:2014-02-26 09:26:05
【问题描述】:

我想提取 ':' 和 '|' 之间的文本字符,但在第二个和第三个数据中,':' 后面有一个空格

输入:

Referencia:22726| Referencia Cliente Ak: 233726 | Referencia histórica: 256726 | Suelo | AGOLADA (Pontevedra) -  CARPAZO O PE#A LONJA [EXTRACT]
Referencia:39766| Referencia Cliente Ak: 39767 | Referencia histórica: 39768 | Garaje | MOJACAR (Almería) -  URB.VILLA MIRADOR DEL MAR - MOD. # [EXTRACT]
Referencia:397A5| Referencia Cliente Ak: 397B5 | Referencia histórica: 397C5 | Garaje | MOJACAR (Almería) -  VILLA MIRADOR DEL MAR-MODULO #-PLAZA 4 [EXTRACT]
Referencia:AA39803| Referencia Cliente Ak: P_39803 | Referencia histórica: 200_39803 | Garaje | MOJACAR (Almería) -  VILLA MIRADOR DEL MAR - MODULO [EXTRACT]

所需的输出:

22776
233726
256726
39766
39767
39768
397A5
397B5
397C5
AA39803
P_39803
200_39803

我的第一个模式:(?<=:)(\w{5,12}) 这仅匹配第一列。

我的第二个模式:(?<=:\s)(\w{5,12}) 这匹配第二列和第三列

所以我相信我的第三个模式是正确的:(?<=:\s?)(\w{5,12}) 该模式不起作用。

【问题讨论】:

  • 您可以使用regex 模块,它支持前瞻和后瞻中的可变长度。他们说,计划替换标准的re 模块。您可以使用 Pip 安装它。 (pip install regex)。

标签: python regex lookbehind


【解决方案1】:

在 python 中,lookbehind 不能是可变长度。解决这个问题的方法:

(?:(?<=:\s)|(?<=:))(\w{5,12})

但是由于您使用捕获组,因此后视是无用的:

:\s?(\w{5,12})

【讨论】:

  • 哦,谢谢。我不知道在 python 中,lookbehind 不能是可变长度。我想这既不是前瞻。但是,它只是在 python 中还是在其他语言中。
  • 前瞻可以是可变长度的。
  • 使用 .net,您可以使用可变长度的lookbehind。 Java 允许使用这个量词{n,m},而 PHP 允许交替使用。
  • 新的解决方案更干净。为什么前瞻可以是可变长度但不能向后看?
  • 我对此没有明确的答案,因为您可以看到正则表达式引擎之间的限制不同。人们说:“由于正则表达式引擎是从左到右工作的,因此很难实现可变长度的后视。” (睡前重复三遍)
【解决方案2】:

删除 Lookbehind 中的 ? 字符,将 \s 移动到匹配项

(?<=:)(\s?\w{5,12})

【讨论】:

  • 谢谢,优雅的解决方案!
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多