匹配字符串与Python RegEx负向前瞻

时间:2018-05-16 19:24:53

标签: python regex-negation negative-lookahead

我有一个包含一些内容的文件,以及两个' include'以下字符串:

make clean
export TOOLCHAIN=/opt/mipsel-tuxbox-linux-gnu
export PATH=$PATH:/opt/mipsel-tuxbox-linux-gnu/libexec/gcc/mipsel-tuxbox-linux-gnu/4.8.1/:/opt/mipsel-tuxbox-linux-gnu/bin
export LDCFLAGS=/opt/mipsel-tuxbox-linux-gnu/lib
export LD_LIBRARY_PATH=/opt/mipsel-tuxbox-linux-gnu/lib
make CC=mipsel-tuxbox-linux-gnu-gcc LD=mipsel-tuxbox-linux-gnu-ld

子串" my_deployment_id"是我需要添加到第二个' include'字符串所以文件内容看起来像这样:

some string1
some string2
...

include: "base_pricing_app_model_my_deployment_id.model.lkml"
include: "base_map_layers.model.lkml"
...
some string3
...

我正在运行Python 3.5并使用其re库。以下是我尝试更换第二个' include'字符串:

some string1
some string2
...

include: "base_pricing_app_model_my_deployment_id.model.lkml"
include: "base_map_layers_my_deployment_id.model.lkml"
...
some string3

然而,两者都包括'条目得到修改,我最终得到以下内容:

with fileinput.input(files=(rfi), inplace=True) as cmodf:
for line in cmodf:
    match_no_dep_id = re.sub('^include:\s\"(?!my_deployment_id).*[.]model[.]lkml\"$', line.split('.')[0] + '_' + 'my_deployment_id' + 'model.lkml' + '"',  line)
    print(match_no_dep_id, end='')

所以我的负向前瞻性regexp匹配两个字符串,包括已经包含我否定的令牌的字符串。

我不确定我在这里缺少什么。 请帮忙。

谢谢!

1 个答案:

答案 0 :(得分:1)

我相信你想要的是^include:\s\".*(?<!my_deployment_id)\.model\.lkml\"$

使用您的^include:\s\"(?!my_deployment_id).*[.]model[.]lkml\"$),您将过滤掉include: "include: "my_deployment_id.base_map_layers.model.lkml"之类的条目(请注意my_deployment_id来自.model.lkml之前而不是之前)

In [1]: string1 = 'include: "base_pricing_app_model_my_deployment_id.model.lkml"'
   ...: string2 = 'include: "base_map_layers.model.lkml"'
   ...: 
   ...: import re
   ...: 
   ...: 
   ...: def clean_include(include: str) -> str:
   ...:     return re.sub(
   ...:         '^include:\s\".*(?<!my_deployment_id)\.model\.lkml\"$',
   ...:         include.split('.')[0] + '_' + 'my_deployment_id' + '.model.lkml' + '"',
   ...:         include,
   ...:     )
   ...: 
   ...: 
   ...: print(clean_include(string1))
   ...: print(clean_include(string2))
   ...: 
   ...: 
include: "base_pricing_app_model_my_deployment_id.model.lkml"
include: "base_map_layers_my_deployment_id.model.lkml"