У меня есть сложный файл, как это:
"start_nm": "BOSTON", "bus_num": "1", "bus_num": "2", "dest_nm": "NEW YorK"
Я хочу получить Boston,1,2,newyork
. Проблема в том, что в некоторых городах 1,2,3,5
а в некоторых 1,2
. 1) Вместо того, чтобы иметь несколько операторов if, как я могу получить их в простом утверждении? 2) Поскольку число bus_num
является динамическим, как я могу сохранить цикл?
match1 = re.search('start_nm\":\"([^"]*)', line)
if match1:
print ("The start is :"+match1.group(1))
match2= re.search('bus_num\":\"(\d+)', line)
if match1:
print ("The start is :"+match1.group(1))
Я могу извлечь их, но ищу простой способ: 1) За исключением этого большого, если условие для всех операторов любых пакетов. 2) Когда длина является динамической для bus_num
как я могу получить цикл?
Здесь решение, которое создает словарь из вашей строки
(намеренно избегать использования пониманий и т.д. для простоты):
line = '"start_nm":"BOSTON","bus_num":"1", "bus_num":"2","dest_nm":"NEW YorK"'
line = (line.replace('\"','')).split(',')
d = {}
for l in line:
k = l.strip().split(':')[0]
v = l.strip().split(':')[1]
if k in d:
d[k] += ' ' + v
else:
d[k] = v
print(d)
print(d['start_nm'], '\t', d['bus_num'], '\t', d['dest_nm'])
## {'start_nm': 'BOSTON', 'bus_num': '1 2', 'dest_nm': 'NEW YorK'}
## BOSTON 1 2 NEW YorK
Быстрый и грязный способ - искать все между :"
и следующим "
, вот так:
>>> line = '> "start_nm":"BOSTON","bus_num":"1", "bus_num":"2","dest_nm":"NEW YorK"'
>>> re.findall(r':"(.*?)"', line)
['BOSTON', '1', '2', 'NEW YorK']
Этот формат очень похож на JSON. Одно из решений:
>>> line = '"start_nm":"BOSTON","bus_num":"1", "bus_num":"2","dest_nm":"NEW YorK"'
>>> json.loads(f"{{ {line} }}").values()
dict_values(['BOSTON', '2', 'NEW YorK'])
Обратите внимание на дубликат ключа "bus_num", который мешает этому решению полностью работать
Другие решения:
>>> line = '"start_nm":"BOSTON","bus_num":"1", "bus_num":"2","dest_nm":"NEW YorK"'
>>> [v.split(",")[0][1:-1] for v in line.split(":")[1:]]
['BOSTON', '1', '2', 'NEW YorK']
"bus_num": [1,2]
или "bus_num1": 1, "bus_num2": 2
. Кроме того, вы захотите заключить каждую строку в {}
(\S*)
на([^"]*)
.