Python/regex: соответствует только букве или букве, за которой следует число

Я хочу разделить эту строку «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']

Кто-нибудь может помочь? Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

\D\d?

Одна из ваших проблем заключается в том, что вы сначала ставите более короткую альтернативу, поэтому более длинная никогда не получает шанса. Например, правильная версия вашего \D|\D\d\D\d|\D. Но просто используйте \D\d?.

Спасибо за ваш комментарий, Келли, \D\d дает ['B4', 'F2'] , так что это нехорошо, а \D\d|\D дает ['A', 'B4', 'F2', 'D'] и может работать!

Marco Di Gennaro 13.02.2023 13:07

@MarcoDiGennaro Почему ты попробовал \D\d?

Kelly Bundy 13.02.2023 13:14

@MarcoDiGennaro Это не \D\d. Знак вопроса в конце важен, потому что он делает совпадение необязательным: \D\d?

Matthias 13.02.2023 13:15

Просто запутался... оба работают! Спасибо

Marco Di Gennaro 13.02.2023 13:18

Используйте расширенные группы

Существует специальный синтаксис для регулярных выражений Python, позволяющий вам сопоставлять заранее, не используя символы (и многое другое).

Вот шаблон, который я бы придумал, используя это:

[A-Z](?![0-9])|[A-Z][0-9]

Это соответствует всем только в одном шаблоне. Могут быть более простые способы согласования, но я считаю, что это наиболее гибкий способ, если вы захотите настроить его позже. Прочитайте это так: жадно сопоставьте букву, если следующий символ не является цифрой. Если это не так, сопоставьте букву, за которой следует цифра.

Больше информации в документации . Если вы хотите протестировать, я рекомендую использовать тестер регулярных выражений, подобный этому, и обязательно выбрать синтаксис python.

Еще одно замечание: это действительно выходит за рамки ваших спецификаций, а другие ответы дают гораздо более короткие варианты. Но при работе с регулярными выражениями важно понимать их эффективность. Циклический просмотр списка шаблонов почти всегда является признаком неправильного использования регулярных выражений.

Pinko 13.02.2023 13:10

Я думаю, что их список/зацикливание не предназначены для решения. Они просто делают это, чтобы показать многочисленные попытки, которые они предприняли.

Kelly Bundy 13.02.2023 13:20

А, имеет смысл. Сначала я подумал, что они попытаются получить совпадения для обоих случаев, используя несколько шаблонов. В любом случае, решения \D\d|\D, \D\d? и \D(?!\d)|\D\d должны продемонстрировать, насколько гибкими являются сопоставления регулярных выражений.

Pinko 13.02.2023 13:36

Другие вопросы по теме