繁体   English   中英

python替换反斜杠

[英]python replace backslash

我正在尝试实现一个简单的帮助程序类,以与java-properties文件进行交互。 摆弄多行属性时遇到一个问题,我无法解决,也许可以吗?

类中的unittest首先将跨越两行的多行属性写入属性文件,然后重新读取它并检查是否相等。 那行得通。 现在,如果我使用该类向该属性添加第三行,它将使用无法解释的其他反斜杠重新读取该行。

这是我的代码:

#!/usr/bin/env python3
# -*- coding=UTF-8 -*-

import codecs
import os, re
import fileinput
import unittest

class ConfigParser:
    reProp = re.compile(r'^(?P<key>[\.\w]+)=(?P<value>.*?)(?P<ext>[\\]?)$')
    rePropExt = re.compile(r'(?P<value>.*?)(?P<ext>[\\]?)$')
    files = []

    def __init__(self, pathes=[]):
       for path in pathes:
           if os.path.isfile(path):
               self.files.append(path)

    def getOptions(self):
        result = {}
        key = ''
        val = ''

        with fileinput.input(self.files, inplace=False) as fi:
            for line in fi:
                m = self.reProp.match(line.strip())
                if m:
                    key = m.group('key')
                    val = m.group('value')
                    result[key] = val
                else:
                    m = self.rePropExt.match(line.rstrip())
                    if m:
                        val = '\n'.join((val, m.group('value')))
                        result[key] = val

        fi.close()
        return result

    def setOptions(self, updates={}):
        options = self.getOptions()
        options.update(updates)

        with fileinput.input(self.files, inplace=True) as fi:
            for line in fi:
                m = self.reProp.match(line.strip())
                if m:
                    key = m.group('key')
                    nval = options[key]
                    nval = nval.replace('\n', '\\\n')
                    print('{}={}'.format(key,nval))

            fi.close()        

class test(unittest.TestCase):
    files = ['test.properties']
    props = {'test.m.a' : 'Johnson\nTanaka'}

    def setUp(self):
        for file in self.files:
            f = codecs.open(file, encoding='utf-8', mode='w')
            for key in self.props.keys():
                val = self.props[key]
                val = re.sub('\n', '\\\n', val)
                f.write(key + '=' + val)
            f.close()

    def teardown(self):
        pass

    def test_read(self):
        c = configparser(self.files) 
        for file in self.files:
            for key in self.props.keys():
                result = c.getOptions()
                self.assertEqual(result[key],self.props[key])

    def test_write(self):
        c = ConfigParser(self.files)
        changes = {}
        for key in self.props.keys():
            changes[key] = self.change_value(self.props[key])

        c.setOptions(changes)       
        result = c.getOptions()
        print('changes: ')
        print(changes)
        print('result: ')
        print(result)
        for key in changes.keys():
            self.assertEqual(result[key],changes[key],msg=key)

    def change_value(self, value):
        return 'Smith\nJohnson\nTanaka'

if __name__ == '__main__':
    unittest.main()

测试运行的输出:

C:\pyt>propertyfileparser.py
changes:
{'test.m.a': 'Smith\nJohnson\nTanaka'}
result:
{'test.m.a': 'Smith\nJohnson\\\nTanaka'}

任何提示欢迎...

由于在编写时在换行符前添加了反斜杠,因此在阅读时也必须将其删除。 取消用'\\\\ n'替换'\\ n'的行的注释可以解决问题,但是我希望这也意味着文件语法不正确。

只有在第二个换行符时才会发生这种情况,因为您将值分为“卵形”和“ nval”,其中“卵形”是第一行,“ nval”是其余行,并且您只对nval。

使用正则表达式替换来替换不是正则表达式的东西也是过大的。 您可以改用val.replace('\\ n','\\\\ n')。

我将以完全不同的方式执行此解析器。 好吧,首先,我根本不会做,我会使用现有的解析器,但是如果这样做,我会在处理行连续问题的同时逐行读取文件,这样我就可以列表中每个项目仅一个值。 然后,我将每个项目解析为一个键和一个带有正则表达式的值,并将其粘贴到字典中。

取而代之的是,您分别解析每行,并将续行与解析后的值连接起来,而IMO则完全倒退了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM