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 Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
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

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