Я хочу разделить эту строку «AB4F2D» на [«A», «B4», «F2», «D»]. По сути, если символ является буквой, верните букву, если символ является числом, верните предыдущий символ плюс текущий символ (к счастью, нет числа> 9, поэтому никогда не бывает X12).
Я пробовал несколько комбинаций, но я не могу найти правильную:
def get_elements(input_string):
patterns = [
r'[A-Z][A-Z0-9]',
r'[A-Z][A-Z0-9]|[A-Z]',
r'\D|\D\d',
r'[A-Z]|[A-Z][0-9]',
r'[A-Z]{1}|[A-Z0-9]{1,2}'
]
for p in patterns:
elements = re.findall(p, input_string)
print(elements)
Результаты:
['AB', 'F2']
['AB', 'F2', 'D']
['A', 'B', 'F', 'D']
['A', 'B', 'F', 'D']
['A', 'B', '4F', '2D']
Кто-нибудь может помочь? Спасибо
\D\d?
Одна из ваших проблем заключается в том, что вы сначала ставите более короткую альтернативу, поэтому более длинная никогда не получает шанса. Например, правильная версия вашего \D|\D\d
— \D\d|\D
. Но просто используйте \D\d?
.
@MarcoDiGennaro Почему ты попробовал \D\d
?
@MarcoDiGennaro Это не \D\d
. Знак вопроса в конце важен, потому что он делает совпадение необязательным: \D\d?
Просто запутался... оба работают! Спасибо
Существует специальный синтаксис для регулярных выражений Python, позволяющий вам сопоставлять заранее, не используя символы (и многое другое).
Вот шаблон, который я бы придумал, используя это:
[A-Z](?![0-9])|[A-Z][0-9]
Это соответствует всем только в одном шаблоне. Могут быть более простые способы согласования, но я считаю, что это наиболее гибкий способ, если вы захотите настроить его позже. Прочитайте это так: жадно сопоставьте букву, если следующий символ не является цифрой. Если это не так, сопоставьте букву, за которой следует цифра.
Больше информации в документации . Если вы хотите протестировать, я рекомендую использовать тестер регулярных выражений, подобный этому, и обязательно выбрать синтаксис python.
Еще одно замечание: это действительно выходит за рамки ваших спецификаций, а другие ответы дают гораздо более короткие варианты. Но при работе с регулярными выражениями важно понимать их эффективность. Циклический просмотр списка шаблонов почти всегда является признаком неправильного использования регулярных выражений.
Я думаю, что их список/зацикливание не предназначены для решения. Они просто делают это, чтобы показать многочисленные попытки, которые они предприняли.
А, имеет смысл. Сначала я подумал, что они попытаются получить совпадения для обоих случаев, используя несколько шаблонов. В любом случае, решения \D\d|\D
, \D\d?
и \D(?!\d)|\D\d
должны продемонстрировать, насколько гибкими являются сопоставления регулярных выражений.
Спасибо за ваш комментарий, Келли,
\D\d
дает['B4', 'F2']
, так что это нехорошо, а\D\d|\D
дает['A', 'B4', 'F2', 'D']
и может работать!