在python中解析此文本的最佳/更简洁方法是什么?

时间:2018-07-09 09:39:39

标签: python python-3.x

我需要从SVG.prop文件中解析以下文本:

parameters.styleList.0.fill=rgb (255, 0, 0)

parameters.styleList.0.key=-2.74, -2.391666666666667

parameters.styleList.0.markerSize=10,10

parameters.styleList.0.stroke=rgb (255, 0, 0)

parameters.styleList.0.strokeCapType=

parameters.styleList.0.strokeDashArray=

parameters.styleList.0.strokeJoinType=

parameters.styleList.0.strokeWidth=0.5px

parameters.styleList.0.symbol=

parameters.styleList.0.title=-2.740 - -2.392

parameters.styleList.1.fill=rgb (255, 85, 0)

parameters.styleList.1.key=-2.391666666666667, -2.0433333333333334

parameters.styleList.1.markerSize=10,10

parameters.styleList.1.stroke=rgb (255, 85, 0)

parameters.styleList.1.strokeCapType=

parameters.styleList.1.strokeDashArray=

parameters.styleList.1.strokeJoinType=

parameters.styleList.1.strokeWidth=0.5px

parameters.styleList.1.symbol=

parameters.styleList.1.title=-2.392 - -2.043

我需要为每个类(“ parameters.styleList。 0 .key”行中的第三个值)获取“ fill”,“ key”和“ title”值。 在Python3中执行此操作的最佳方法是什么? 谢谢

1 个答案:

答案 0 :(得分:1)

使用re模块可以很容易地用正则表达式进行解析。

import re
from collections import defaultdict
from pprint import pprint

data = """
parameters.styleList.0.fill=rgb (255, 0, 0)
parameters.styleList.0.key=-2.74, -2.391666666666667
parameters.styleList.0.markerSize=10,10
parameters.styleList.0.stroke=rgb (255, 0, 0)
parameters.styleList.0.strokeCapType=
parameters.styleList.0.strokeDashArray=
parameters.styleList.0.strokeJoinType=
parameters.styleList.0.strokeWidth=0.5px
parameters.styleList.0.symbol=
parameters.styleList.0.title=-2.740 - -2.392
parameters.styleList.1.fill=rgb (255, 85, 0)
parameters.styleList.1.key=-2.391666666666667, -2.0433333333333334
parameters.styleList.1.markerSize=10,10
parameters.styleList.1.stroke=rgb (255, 85, 0)
parameters.styleList.1.strokeCapType=
parameters.styleList.1.strokeDashArray=
parameters.styleList.1.strokeJoinType=
parameters.styleList.1.strokeWidth=0.5px
parameters.styleList.1.symbol=
parameters.styleList.1.title=-2.392 - -2.043
"""


style_re = re.compile('^parameters\.styleList\.(?P<id>.+?)\.(?P<property>.+?)=(?P<value>.*)$', re.MULTILINE)

styles = defaultdict(dict)

for match in style_re.finditer(data):
    id, property, value = match.groups()
    styles[id][property] = value

pprint(dict(styles))

输出

{'0': {'fill': 'rgb (255, 0, 0)',
       'key': '-2.74, -2.391666666666667',
       'markerSize': '10,10',
       'stroke': 'rgb (255, 0, 0)',
       'strokeCapType': '',
       'strokeDashArray': '',
       'strokeJoinType': '',
       'strokeWidth': '0.5px',
       'symbol': '',
       'title': '-2.740 - -2.392'},
 '1': {'fill': 'rgb (255, 85, 0)',
       'key': '-2.391666666666667, -2.0433333333333334',
       'markerSize': '10,10',
       'stroke': 'rgb (255, 85, 0)',
       'strokeCapType': '',
       'strokeDashArray': '',
       'strokeJoinType': '',
       'strokeWidth': '0.5px',
       'symbol': '',
       'title': '-2.392 - -2.043'}}