Python-匹配单词但不匹配单词,并在其旁边再匹配另一个单词

时间:2019-06-02 04:46:20

标签: python regex

我正在尝试将/etc/nslcd.conf文件中的值替换为参数文件中的值。有两个参数使我非常痛心。

base dc=example,dc=com
base   group ou=groups,dc=example,dc=com

参数文件具有这两个变量的值

base = dc=company,dc=org
base   group = ou=admingroups,dc=company,dc=org

在将每个参数存储在像这样的字典中之后,我要遍历每个参数

for key in sorted(d):
  item = key
  print("Processing Key:", item)
  with open ('/etc/nslcd.conf', 'r') as fr:
    with open ('/tmp/nslcd_tmp', 'w+') as fw:
      # Iterate through lines in nslcd.conf file
      for line in fr:
        # Some options are commented and some are not
        itemy = '#' + item
        if line.startswith(item) or line.startswith(itemy):
          print('Replaced value for:', item)
          fw.write(item + '' + d[item])
        elif item == 'base   group':
          fw.write(item + '' + d[item])
        else:
          fw.write(line)

我遇到的问题是... 1.由于文件中多次提到诸如uri之类的键,因此我必须循环浏览所有行并替换所有行。
2.因此,第一个“基础”将遍历,并将以“基础”开头的所有行替换为“基础dc = company,dc = org”,并且不再需要替换“基础组”项。

我如何告诉它与“基本组”中的“基本”不匹配?这些不是我要替换的唯一项目,因此我将其尽可能保持通用。谢谢。

1 个答案:

答案 0 :(得分:0)

最好从配置行获取配置密钥,然后查找它是否与需要覆盖而不是具有多个循环级别的配置相匹配。以下代码使用正则表达式通过捕获组选择器提取配置密钥。

import re

regex = '^#?\s*(\w+\s*\w*)\s\w*='

d = {
    "base": "dc=company,dc=org",
    "base   group": "ou=admingroups,dc=company,dc=org"
}

with open ('nslcd.conf', 'r') as fr:
    with open ('result.conf', 'w+') as fw:
        for line in fr:

            line = line.strip()
            match = re.search(regex, line)

            if match and match.group(1) and match.group(1) in d:
                key = match.group(1)
                fw.write(('', '# ')[line.startswith('#')] + key + ' ' + d[key] + '\n')
            else:
                fw.write(line)