我有以下测试,我想提取 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:837483 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:之间,我希望最后一个要做什么?
编辑:
我想提取:
REST 75RF-3729-70D-01
REST 75RF-3729-70D-02
REST 75RF-3729-70D-03
REST 54783-04
REST 45923
编辑2:
我需要REST部分,我更新了问题并添加了一些 CLUE 以强调我需要 REST
我使用Python 2.7
编辑3:
我还需要在
中找到 REST 456734REST HAB:REST sdfdgdsd HAB:456734
答案 0 :(得分:2)
您要求匹配REST
到HAB:
不包括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 +非空白字符。(\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)
在捕获组1,2中成对捕获要提取的内容