python regex解析键值对,值中包含多行

时间:2018-10-03 10:26:41

标签: python regex

我正在尝试解析具有多个键,值行的文件,如下所示

"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不匹配。如何解决此问题,以获取所有键值对,包括具有多行值的键对?

2 个答案:

答案 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";')