2013-07-07 4 views
2

Я пишу программу для преобразования стандартных путей SVG в дружественный формат Raphael.js.Python- Удалить символы, затем присоединиться к строке

Путь данных в формате

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) 

ответ

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) 
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 
+0

+1 гораздо более простое решение ... –

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 
+0

Не кажется ли вам это излишеством? Это может быть легко сделано с помощью 're.sub (r '(\ s +) | (\. \ D +)', '', line)' –

+0

Я определенно должен изучить регулярное выражение ... –

Смежные вопросы