Регулярное выражение для извлечения только слова - PullRequest
1 голос
/ 16 апреля 2019

У меня сложный файл, подобный этому:

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

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

Этот формат очень похож на 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 голосов
/ 17 апреля 2019

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

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 голосов
/ 17 апреля 2019

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

>>> line = '>   "start_nm":"BOSTON","bus_num":"1", "bus_num":"2","dest_nm":"NEW YorK"'
>>> re.findall(r':"(.*?)"', line)
['BOSTON', '1', '2', 'NEW YorK']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...