【问题标题】:Matching a string with Python RegEx negative lookahead使用 Python RegEx 负前瞻匹配字符串
【发布时间】:2018-05-16 19:24:52
【问题描述】:

我有一个包含一些内容的文件以及下面的两个“包含”字符串:

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”是我需要添加到第二个“包含”字符串的标记,因此文件内容如下所示:

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 库。这是我尝试替换第二个“包含”字符串的方法:

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

但是,两个“包含”条目都被修改了,我最终得到以下内容:

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
...

所以我的否定前瞻正则表达式匹配两个字符串,包括已经包含我要否定的令牌的字符串。

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

谢谢!

【问题讨论】:

    标签: python regex-negation negative-lookahead


    【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多