RegEx:匹配除特定子字符串以外的所有行

时间:2018-10-29 08:57:55

标签: python regex

下面是列表:

cf-ab1
cf-bc2
cf-ab1-hotfix
cf-bc2-hotfix
cf-ab1-canary
cf-cd1-staging
cf-cd1-staging2
cf-cd1
cf-cd1-sic-staging
cf-cd1-sagdf-staging

我想匹配cf-cd1-staging, cf-cd1-staging2 and cf-ab1-canary以外的所有内容 我正在运行以下正则表达式:

 ^((?!canary|staging).)*$

但是理想情况下,这些匹配所有不包含分段和金丝雀的行。这不应该是我想要的输出。

请在这里帮忙..!?因为我想要的匹配项应该是:

cf-ab1
cf-bc2
cf-ab1-hotfix
cf-bc2-hotfix
cf-cd1
cf-cd1-sic-staging
cf-cd1-sagdf-staging

此致

罗伊斯

2 个答案:

答案 0 :(得分:1)

尝试一下:-

import re

lines = ["cf-ab1", "cf-bc2", "cf-ab1-hotfix", "cf-bc2-hotfix", "cf-ab1-canary", "cf- 
cd1-staging", "cf-cd1-staging2", "cf-cd1", "cf-cd1-sic-staging", "cf-cd1-sagdf- 
staging"]

line_compile = re.compile('^(?!.*(ab1-canary|cd1-staging|cf-ab1-canary)).*$')

matched = []

for line in lines:
  if  line_compile.match(line):
     matched.append(line)

答案 1 :(得分:0)

与RegEx一样,有很多可能的解决方案。我想出了一个动态的方法,但是您可能会说它已经过度适合该数据集,而且没有很笼统。

^cf-\w\w\d(-[hs][oia][tcg].+?)?$

我只是在方括号中写下了所有“允许的”字母,直到不再可能出现不希望的匹配为止。另外,我将后半部分放在()中?这样两个短条目也将匹配。