Регулярное выражение для извлечения только слова

1

У меня есть сложный файл, как это:

"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 как я могу получить цикл?

  • 0
    Измените (\S*) на ([^"]*) .
  • 0
    Спасибо, что сработало. но есть ли лучший пакет для этих вещей, кроме того, что я делаю?
Показать ещё 4 комментария
Теги:

3 ответа

0

Здесь решение, которое создает словарь из вашей строки
(намеренно избегать использования пониманий и т.д. для простоты):

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  
0

Быстрый и грязный способ - искать все между :" и следующим ", вот так:

>>> line = '>   "start_nm":"BOSTON","bus_num":"1", "bus_num":"2","dest_nm":"NEW YorK"'
>>> re.findall(r':"(.*?)"', line)
['BOSTON', '1', '2', 'NEW YorK']
0

Этот формат очень похож на 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']
  • 0
    Я хочу использовать подход JSON есть способ, которым мы можем включить оба номера bus_numbers
  • 0
    @ MLLearner2 Да, либо выполните "bus_num": [1,2] или "bus_num1": 1, "bus_num2": 2 . Кроме того, вы захотите заключить каждую строку в {}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню