Небольшой трик с регулярными выражениями который редко вижу в чужом коде.
Допустим, вам нужно распарсить простой текст и вытащить оттуда пары имя+телефон. Вернуть всё это надо в виде списка словарей. Возьмем очень простой пример текста.
>>> text = '''
>>> Alex:8999123456
>>> Mike:+799987654
>>> Oleg:+344456789
>>> '''
Соответственно, для выделения нужных элементов будем использовать группы. Получится такой паттерн:
(\w+):([\d+]+)
Как мы будем формировать словарь из найденных групп?
>>> import re
>>> results = []
>>> for match in re.finditer(r"(\w+):([\d+]+)", text):
>>> results.append({
>>> "name": match.group(1),
>>> "phone": match.group(2)
>>> })
>>> print(results)
[{'name': 'Alex', 'phone': '8999123456'}, ...]
Можно немного сократить запись используя zip
>>> results = []
>>> for match in re.finditer(r"(\w+):([\d+]+)", text):
>>> results.append(dict(zip(['name', 'phone'], match.groups())))
Но есть способ лучше! Это именованные группы в regex. Можно в паттерне указать имя группы и результат сразу забрать в виде словаря.
>>> for match in re.finditer(r"(?P<name>\w+):(?P<phone>[\d+]+)", text):
>>> results.append(match.groupdict())
То есть всё что я сделал, это добавил в начале группы (внутри сбокочек) такую запись:
(?P<group-name>...)
Теперь найденная группа имеет имя и можно обратиться к ней как к элементу списка
>>> name = match['name']
Либо забрать сразу весь словарь методом groupdict()
>>> match.groupdict()
#tricks#regex
Сегодня заметил интересную цифру в профиле. Нас стало 10 000.
Честно говоря, для меня это первый серьезный психологический барьер. Кто бы мог подумать, что столько людей добровольно подпишется на то, чтобы читать мои порой язвительные заметки, изучать узбекский язык без «сахара» и смотреть правде в глаза, какой бы неудобной она ни была?
Видимо, скептицизм и тяга к знаниям все-таки заразны. Или вам просто нравится наблюдать, как я ворчу на несправедливость и коверкание языка. В любом случае, я рад, что мы собрали в Фэйсбуке аудиторию думающих людей.
Спасибо, что читаете, спорите и учитесь. Идем к следующему барьеру.
P.S. Кстати, обратите внимание на число моих подписок рядом — 666. Идеальный баланс, я считаю. 😏
#SkeptikBek#10k#УзбекскийЯзык#МыслиВслух#БекзодРустамбеков
t.me/skeptikbek
#Nature#Tiger#10k#Painting#mobile#India#animals#wild
Preview HD
Fact:
India is home to an estimated 3,682 wild tigers, accounting for approximately 75% of the whole world's wild tiger population.
High res wallpaper loading... (1min remaining)
#Indian#India#14k#10k#women#Portrait#Mobile#PC#Tab#Traditional_Attire
• Introducing the Highest Quality Wallpaper of this Channel.
- 275 Million Pixels, takes space of 336MB
- Can be used for PC, Mobile, Tablet or Advertisement banners.
Download
Search terms:
#nature#scenery#immersive#landscape#rollinghills#countryside#tuscany#greenery#peaceful#wallpaper#aesthetic#rural#sunlight#windingroad#farmhouse#10k#Mobile#Desktop#Tab
Preview HD
An idyllic, high-angle landscape featuring sun-drenched rolling green hills and a winding path leading to a rustic stone farmhouse.
Download
🥰
Search terms:
#porsche #gt3rs #supercar #autumn #fallvibes #graffiti #matteblack
#redandgrey #streetphotography #abandoned #carwallpaper #automotive#moody #leaves#mobile#10k#car#porsche911#highres
Preview HD
A high-performance Porsche 911 GT3 RS with matte grey and red accents, staged in a moody, industrial setting filled with autumn leaves.
High res wallpaper loading... (1min remaining)