Соответствие строки с отрицательным прогнозом Python RegEx - PullRequest
0 голосов
/ 16 мая 2018

У меня есть файл с некоторым содержанием, а также две строки 'include' ниже:

some string1
some string2
...

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

Подстрока "my_deployment_id" - это токен, который мне нужно добавить ко второй строке '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

Я использую Python 3.5 и использую его библиотеку re. Вот как я пытаюсь заменить вторую строку include:

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='')

Однако обе записи «include» модифицируются, и я получаю следующее содержимое:

some string1
some string2

include: "base_pricing_app_model_my_deployment_id_my_deployment_id.model.lkml"
include: "base_map_layers_my_deployment_id.model.lkml"

some string3
...

Так что мое отрицательное регулярное выражение регулярного выражения соответствует обеим строкам, включая ту, которая уже содержит токен, который я отрицаю.

Я не уверен, что мне здесь не хватает. Пожалуйста, помогите.

Спасибо!

1 Ответ

0 голосов
/ 17 мая 2018

Я верю, что вы хотите ^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"
...