#python #regex
#python #регулярное выражение
Вопрос:
У меня есть такой сложный файл:
«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
как я могу иметь цикл?
Комментарии:
1.Измените
(S*)
на([^"]*)
.2. Спасибо, что сработало. но есть ли лучший пакет для этих вещей, кроме того, что я делаю?
3. Если это JSON, используйте
json
module .4. Это не json, это текстовый файл. У меня таких условий около 20. поэтому я пишу if else else ….. ищу что-нибудь получше
5. Можете ли вы гарантировать, что внутри текстового поля нет запятых? Это значительно упростило бы проблему.
Ответ №1:
Быстрый и грязный способ — искать все между :"
и следующим "
, вот так:
>>> line = '> "start_nm":"BOSTON","bus_num":"1", "bus_num":"2","dest_nm":"NEW YorK"'
>>> re.findall(r':"(.*?)"', line)
['BOSTON', '1', '2', 'NEW YorK']
Ответ №2:
Этот формат очень похож на 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']
Комментарии:
1. Я хочу использовать подход json есть ли способ, которым мы можем включить оба bus_numbers
2. @MLLearner2 Да, либо сделайте
"bus_num": [1,2]
, либо"bus_num1": 1, "bus_num2": 2
. Кроме того, вы захотите заключить каждую строку с{}
Ответ №3:
Вот решение, которое создает словарь из вашей строки
(намеренно избегается использование понятий и т. Д. для простоты):
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