2

我正在编写一个程序来将标准 SVG 路径转换为 ​​Raphael.js 友好格式。

路径数据格式为

d="M 62.678745,
   259.31235 L 63.560745,
   258.43135 L 64.220745,
   257.99135 L 64.439745,
   258.43135 L 64.000745
     ...
     ...
   "

我想做的是首先删除十进制数字,然后删除空格。最终结果应该是格式

d="M62,
   259L63,
   258L64,
   257L64,
   258L64
     ...
     ...
   "

我有大约 2000 条左右的路径可以解析并转换为 JSON 文件。

到目前为止我所做的是

from bs4 import BeautifulSoup

svg = open("/path/to/file.svg", "r").read()
soup = BeautifulSoup(svg)
paths = soup.findAll("path")

raphael = []

for p in paths:
  splitData = p['d'].split(",")
  tempList = []

    for s in splitData:
      #strip decimals from string
      #don't know how to do this

      #remove whitespace
      s.replace(" ", "")

      #add to templist
      tempList.append(s + ", ")

    tempList[-1].replace(", ", "")
    raphael.append(tempList)
4

3 回答 3

3

您可以使用regex

>>> import re
>>> d="""M 62.678745,
   259.31235 L 63.560745,
   258.43135 L 64.220745,
   257.99135 L 64.439745,
   258.43135 L 64.000745"""

for strs in d.splitlines():
    print  re.sub(r'(\s+)|(\.\d+)','',strs)
...     
M62,
259L63,
258L64,
257L64,
258L64
于 2013-07-07T18:52:11.117 回答
1

您可以构建一个蛮力解析器:

def isint(x):
    try:
        int(float(x))
        return True
    except:
        return False

def parser(s):
    mystr = lambda x: str(int(float(x)))
    s = s.replace('\n','##')
    tmp = ','.join( [''.join([mystr(x) if isint(x) else x \
                         for x in j.split()]) \
                         for j in s.split(',')] )
    return tmp.replace('##', '\n')

测试:

d="M 62.678745,\n 259.31235 L 63.560745,\n 258.43135 L 64.220745, \n 257.99135 L 64.439745, \n 258.43135 L 64.000745 "
print parser(d)
# M62,
# 259L63,
# 258L64,
# 257L64,
# 258L64
于 2013-07-07T19:01:01.927 回答
1

尝试这个:

import re
from bs4 import BeautifulSoup

svg = open("/path/to/file.svg", "r").read()
soup = BeautifulSoup(svg)
paths = soup.findAll("path")

raphael = []

for p in paths:
    splitData = p['d'].split(",")
    for line in splitData:
        # Remove ".000000" part
        line = re.sub("\.\d*", "", line)
        line = line.replace(" ", "")
        raphael.append(line)

d = ",\n".join(raphael)
于 2013-07-07T18:44:49.083 回答