正则表达式:查找单词但不允许重复

时间:2018-04-02 22:36:21

标签: python regex python-2.7

我有以下测试,我想提取 HAB之后的所有代码:,他们必须在前面有 REST ,但可以在其间有其他单词:

  

REST gfdjj REST HAB:75RF-3729-70D-01 CLUE HAB:234-543 REST tt HAB:75RF-3729-70D-02 CLUE ytr HAB:34829-5467 REST HAB:75RF-3729-70D-03 REST REST REST HAB:54783-04 REST HA:8374​​83 REST dfhjdf REST 347845-34 REST rehs HAB:45923 REST HAB:REST sdfdgdsd HAB:456734

https://regex101.com/r/4inYr4/3

我尝试了(REST.*?) *(HAB:) (.*?)( |$)但它也返回了许多冗余的 REST

(REST) *(HAB:) (.*?)( |$)但它不会返回第二个代码,

(REST(?!.*REST).*?) *(HAB:) (.*?)( |$)但它只返回最后一个。

我需要某种条件正则表达式,只允许 REST 之外的其他单词介于 REST HAB:之间,我希望最后一个要做什么?

编辑:

我想提取:

  1. REST 75RF-3729-70D-01

  2. REST 75RF-3729-70D-02

  3. REST 75RF-3729-70D-03

  4. REST 54783-04

  5. REST 45923

  6. 编辑2:

    我需要REST部分,我更新了问题并添加了一些 CLUE 以强调我需要 REST

    我使用Python 2.7

    编辑3:

    我还需要在

    中找到 REST 456734
      

    REST HAB:REST sdfdgdsd HAB:456734

2 个答案:

答案 0 :(得分:2)

您要求匹配RESTHAB:不包括REST的文字的要求实际上并没有帮助,但它不会影响匹配,但是{{1}之后的文字}不能是HAB:,因为它会阻止有效匹配。

您可以使用

REST

请参阅regex demo

<强>详情

  • (REST).*?HAB:\s*(?!REST(?!\S))(\S+) - 第1组:(REST)子字符串
  • REST - 除了换行符之外的任何0 +字符,尽可能少
  • .*? - HAB:文字子字符串
  • HAB: - 0+ whitespaces
  • \s* - 如果在当前位置的右侧,(?!REST(?!\S))后跟空格或字符串结尾
  • ,则会导致匹配失败的否定前瞻
  • REST - 第2组:任何1 +非空白字符。

Python code demo

(\S+)

答案 1 :(得分:1)

你想要这样的输出吗?

REST 75RF-3729-70D-01
REST 75RF-3729-70D-02
REST 75RF-3729-70D-03
REST 54783-04
REST 45923
REST 456734
REST 456734

您可以尝试这种模式。

.*?(REST\s)(?:(?:(?!REST|HAB).)*HAB\:\s*)(\b(?:(?!REST)[-\w])+\b)

Demo

在捕获组1,2中成对捕获要提取的内容