Разложить строку разных символов в питоне - PullRequest
0 голосов
/ 13 декабря 2018

возможно ли эффективно разложить строку, подобную этой:

'G:1{l:3:"cat";v:30;l:3:"dog";v:0;l:5:"horse";v:20;l:6:"rabbit";v:50;}'

на эту для дальнейшей обработки:

"cat", 30
"dog", 0
"horse", 20
"rabbit", 50

Я пытался использовать шаблоны Regex и сложные циклы, но я сделалне далеко.

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Вы можете использовать:

import re
x = 'G:1{l:3:"cat";v:30;l:3:"dog";v:0;l:5:"horse";v:20;l:6:"rabbit";v:50;}'
r = re.findall(r'(".*?");v:(\d+)', x)
for y in r:
    print(f"{y[0]}, {y[1]}")

Выход:

"cat", 30
"dog", 0
"horse", 20
"rabbit", 50

Python Demo

0 голосов
/ 13 декабря 2018

Вы можете использовать следующий шаблон, а затем разделить его:

import re

your_string = 'G:1{l:3:"cat";v:30;l:3:"dog";v:0;l:5:"horse";v:20;l:6:"rabbit";v:50;}'

result = [val.split('";v:') for val in re.findall('l:\d:"(\w+\";v:\d+);', your_string)]

Выход

[['cat', '30'], ['dog', '0'], ['horse', '20'], ['rabbit', '50']]
0 голосов
/ 13 декабря 2018

Вы можете попробовать этот помощник

\"[A-Za-z]+\"|(?<=v:)\d+

Объяснение

  • \"[A-Za-z]+\" - Совпадения " с последующим любымчисло alphabet с последующим ".
  • | - Чередование работает так же, как логическое ИЛИ.
  • (?<=v:)\d+ - Соответствует любому v:, за которым следует любое число.

Демо

0 голосов
/ 13 декабря 2018

Вы можете использовать регулярное выражение для поиска шаблона:

import re

s = 'G:1{l:3:"cat";v:30;l:3:"dog";v:0;l:5:"horse";v:20;l:6:"rabbit";v:50;}'

re.findall(r'("[A-Za-z]+");v:(\d+)', s)
# [('"cat"', '30'), ('"dog"', '0'), ('"horse"', '20'), ('"rabbit"', '50')]

С этим списком вы сможете получить его в нужном формате:

for row in re.findall(r'("[A-Za-z]+");v:(\d+)', s):
    print("{}, {}".format(*row))
# "cat", 30
# "dog", 0
# "horse", 20
# "rabbit", 50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...