[英]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.