【问题标题】:What is the best/cleaner way to parse this text in python?在 python 中解析此文本的最佳/更清洁的方法是什么?
【发布时间】:2018-12-16 22:53:57
【问题描述】:

我需要从 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 中执行此操作的最佳方法是什么? 谢谢

【问题讨论】:

  • 您目前的方法是什么?到目前为止,您尝试过什么吗?有没有看过stackoverflow.com/questions/15857818/python-svg-parser等其他问题?
  • @dorvak 这个问题不相关,因为这不是一个 SVG 文件,但显然是一个以某种方式描述 SVG 的属性文件。

标签: python python-3.x


【解决方案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'}}

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 2015-06-14
    • 2011-09-05
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多