#python #regex
Вопрос:
Это данные в виде списка:
states = ['Alabama (AL)', 'Alaska (AK)', 'Arizona (AZ)', 'Arkansas (AR)', 'California (CA)', 'Colorado (CO)', 'Connecticut (CT)', 'Delaware (DE)', 'District of Columbia (DC)', 'Florida (FL)', 'Georgia (GA)', 'Hawaii (HI)', 'Idaho (ID)', 'Illinois (IL)', 'Indiana (IN)', 'Iowa (IA)', 'Kansas (KS)', 'Kentucky (KY)', 'Louisiana (LA)', 'Maine (ME)', 'Maryland (MD)', 'Massachusetts (MA)', 'Michigan (MI)', 'Minnesota (MN)', 'Mississippi (MS)', 'Missouri (MO)', 'Montana (MT)', 'Nebraska (NE)', 'Nevada (NV)', 'New Hampshire (NH)', 'New Jersey (NJ)', 'New Mexico (NM)', 'New York (NY)', 'North Carolina (NC)', 'North Dakota (ND)', 'Ohio (OH)', 'Oklahoma (OK)', 'Oregon (OR)', 'Pennsylvania (PA)', 'Rhode Island (RI)', 'South Carolina (SC)', 'South Dakota (SD)', 'Tennessee (TN)', 'Texas (TX)', 'Utah (UT)', 'Vermont (VT)', 'Virginia (VA)', 'Washington (WA)', 'West Virginia (WV)', 'Wisconsin (WI)', 'Wyoming (WY)']
Я хочу извлечь все коды в скобках.
Этот код возвращен None
:
re.search('[(A-Z)]')
Как я могу это сделать?
Комментарии:
1. Вы понимаете, что у вас есть список строк, а не одна строка? Регулярное выражение «[A-Z][A-Z]» будет работать, но вам нужно будет применить его к каждой строке в списке, по одной за раз. Учитывая этот код, было бы более эффективно просто сделать
codes = [k[-3:-1] for k in states]
.
Ответ №1:
Поскольку вы используете список, вам, вероятно, не нужно регулярное выражение. Если вы уверены, что это формат, что-то вроде этого должно сделать это:
abbreviations = [state[-3:-1] for state in states]
Этот код использует понимание списка, чтобы создать новый список из вашего старого списка. Для каждого элемента в states
списке мы используем отрицательные индексы (которые начинаются в конце строки) и оператор среза, чтобы извлечь сокращения, поскольку они всегда являются 2-м по счету и 3-м по счету символами в строках.
Пример использования:
>>> states = ['Alabama (AL)', 'Alaska (AK)', 'Arizona (AZ)', 'Arkansas (AR)', 'California (CA)']
>>> [state[-3:-1] for state in states]
['AL', 'AK', 'AZ', 'AR', 'CA']
Комментарии:
1. хорошо, спасибо, это работает для меня, результатов нет в списке, так что мы будем делать после
2. Каков формат результата, который вам нужен?
3. если результаты являются строками
Ответ №2:
import re
regex = r"(?<=()[A-Z] (?=))"
print(re.findall(regex, "".join(states)))
Выход:
['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FL', 'GA', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY']