我有一个包含一些内容的文件,以及两个' 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匹配两个字符串,包括已经包含我否定的令牌的字符串。
我不确定我在这里缺少什么。 请帮忙。
谢谢!
答案 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"