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

2024-09-28 22:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的测试,我想提取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以外的其他单词介于RESTHAB:之间,我希望最后一个可以这样做?你知道吗

编辑:

我想提取:

  1. 其余75RF-3729-70D-01

  2. 其余75RF-3729-70D-02

  3. 其余75RF-3729-70D-03

  4. 其余54783-04

  5. 其余45923

编辑2:

我需要剩下的部分,我更新了问题并添加了一些线索来强调我需要休息

我使用python2.7

编辑3:

我还需要找到REST456734 in:

REST HAB: REST sdfdgdsd HAB: 456734


Tags: 代码httpsrest编辑单词tthaclue
2条回答

你想要这样的输出吗?你知道吗

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中成对捕获的

您要求匹配从RESTHAB:的文本(不包括REST),实际上没有帮助,它不会对匹配产生太大影响,但是HAB:之后的文本不能是REST,因为它会阻止有效的匹配。你知道吗

你可以用

(REST).*?HAB:\s*(?!REST(?!\S))(\S+)

参见regex demo

细节

  • (REST)-第1组:一个REST子串
  • .*?-除换行符以外的任何0+字符,尽可能少
  • HAB:-a HAB:文字子串
  • \s*-0+空格
  • (?!REST(?!\S))-如果在当前位置的右侧紧跟着有REST后跟空格或字符串结尾,则会导致匹配失败的负前瞻
  • (\S+)-第2组:任何1+非空白字符。你知道吗

Python code demo

import re
rx = r"(REST).*?HAB:\s*(?!REST(?!\S))(\S+)"
s = """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\nREST HAB: REST sdfdgdsd HAB: 456734"""
res = ["{} {}".format(x.group(1),x.group(2)) for x in re.finditer(rx, s)]
print(res)
# => ['REST 75RF-3729-70D-01', 'REST 75RF-3729-70D-02', 'REST 75RF-3729-70D-03', 
#    'REST 54783-04', 'REST 45923', 'REST 456734']

相关问题 更多 >