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

#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