我正在尝试解析具有多个键,值行的文件,如下所示
"key1" = "value1";
"key2" = "value2";
"key3" = "value3_line1
value3_line2
value3_line3";
"key4" = "value4";
我正在使用下面的代码来解析此文件
def parseFile(f):
regex = re.compile(r'^"(.*)"\s+=\s+"(.*)";',re.MULTILINE)
with open(f) as string_file:
alllines = string_file.read()
matches = [m.groups() for m in regex.finditer(alllines)]
for m in matches:
print(m[0], '=>', m[1])
此代码与具有key1,key2和key4的行匹配,但与key3不匹配。如何解决此问题,以获取所有键值对,包括具有多行值的键对?
答案 0 :(得分:1)
您可以使用re.DOTALL
标志,该标志允许.
匹配换行符。您还应该使用非贪婪量词*?
来匹配最接近的双引号对:
更改:
regex = re.compile(r'^"(.*)"\s+=\s+"(.*)";',re.MULTILINE)
收件人:
regex = re.compile(r'^"(.*?)"\s+=\s+"(.*?)";',re.MULTILINE | re.DOTALL)
或者,您可以使用排除"
的字符类:
regex = re.compile(r'^"([^"]*)"\s+=\s+"([^"]*)";',re.MULTILINE)
答案 1 :(得分:0)
它与"key3"
不匹配,因为该行缺少引号和分号。
尝试模式re.compile(r'^"(.*)"\s+=\s+"(.*)"?;?',re.MULTILINE)
或re.compile(r'^"(.*)"\s+=\s+"(.*)$',re.MULTILINE)
例如:
import re
s = '''"key1" = "value1";
"key2" = "value2";
"key3" = "value3_line1
value3_line2
value3_line3";
"key4" = "value4";'''
regex = re.compile(r'^"(.*)"\s+=\s+"(.*)"?;?',re.MULTILINE)
matches = [m.groups() for m in regex.finditer(s)]
for m in matches:
print(m[0], '=>', m[1])
输出:
('key1', '=>', 'value1";')
('key2', '=>', 'value2";')
('key3', '=>', 'value3_line1')
('key4', '=>', 'value4";')