【问题标题】:Change path's in yaml files更改 yaml 文件中的路径
【发布时间】:2014-03-27 19:07:19
【问题描述】:

您好 python 和正则表达式专家!

我有一个包含很多 yaml 文件的文件树,我需要在其中更改文件中多个位置的路径字符串。

yaml 文件可能如下所示:

之前

- !import ../../../app/app.yml
- !import ../../fw/fw/app.yml
- !import ../../id/id/app.yml

includes:    [ ../, ../../../app/include/, ../../fw/include, ]

includes:
    - ../
    - ../../../app/include/
    - ../../fw/include

需要改成:

通缉

- !import ../../../Sys/app/app.yml
- !import ../../Sys/fw/fw/app.yml
- !import ../../id/id/app.yml

includes:    [ ../, ../../../Sys/app/include/, ../../Sys/fw/include, ]

includes:
    - ../
    - ../../../Sys/app/include/
    - ../../Sys/fw/include

...所以每个路径都必须以 /Sys 为前缀,因为指向的文件的位置已经改变。请注意,某些路径不得更改:'- !import ../../id/id/app.yml' 不得更改(可能还有其他路径)

上面的示例中有两个包含标记,因为它在要更改的文件中的写入方式不同。

所以我需要一个适用于上述所有组合的正则表达式。我已经尝试了很多迭代,但我正在努力涵盖两个包含标签。

注意:我宁愿使用纯文本文件解析而不是使用pyaml,以免破坏文件的格式,因为其中一些包含很多cmets。

欢迎提出任何建议-谢谢

【问题讨论】:

  • “(可能还有其他路径)”是一个可怕的想法。生成的表达式可能适用于您那里的内容,但它肯定不会容纳未知数。我建议您执行多次替换,准确替换您想要替换的内容(例如,将 ../app 替换为 ../Sys/app)。

标签: python regex


【解决方案1】:

我会使用这样的东西:

output = re.sub(r"\.\./(?=\w)(?!id)", "../Sys/", input)

regex101 demo

请注意,由于关于不应更改的内容的信息有限,因此很难找到一个不会正确替换某些文件路径的文件。正则表达式适用于模式,因此如果没有适当的规则,您一定会发现缺点。

【讨论】:

  • 嗨,杰瑞。感谢您的输入。我正在考虑制作一个不改变的排除列表。我可以使用列表并在遍历列表时交换 (?!id) 中的“id”吗?
  • @PeterDalgaardHansen 如果您有要排除的内容列表,当然可以。您可以使用 r"\.\./(?=\w)(?!" + strList + ")" where strList = "|".join(list) 之类的东西,这样您就不必遍历单词列表。嗯,顺便说一句,我也刚刚意识到一件事。您是否有包含非字母数字字符的文件名?如果不是,最好改用r"\.\./(?=\w)(?!(?:" + strList + ")\b)"
【解决方案2】:

试试这个:

input = re.sub("((?:\.\./)+)(?=[a-zA-Z0-9])", '\\1Sys/', input)

捕获连续的../,如果后面跟着一个字母数字,则在组\\1中捕获它

【讨论】:

    【解决方案3】:
    import re
    
    pat = re.compile(r"""
    ((\.\./){2,}) # at least two levels up
    (?!id/)       # no replace of id/ paths
    (.*?)
    """, flags=re.VERBOSE)
    
    print pat.sub(r"\1Sys/\3", yaml)
    

    输出:

    - !import ../../../Sys/app/app.yml
    - !import ../../Sys/fw/fw/app.yml
    - !import ../../id/id/app.yml
    
    includes:    [ ../, ../../../Sys/app/include/, ../../Sys/fw/include, ]
    
    includes:
        - ../
        - ../../../Sys/app/include/
        - ../../Sys/fw/include
    

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 2020-09-24
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 2018-11-27
      • 1970-01-01
      相关资源
      最近更新 更多