Регулярное выражение Python, разделение строки с несколькими разделителями

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

Входные строки:

1. "ABC-QWERT01"
2. "ABC-QWERT01DV"
3. "ABCQWER01"

Критерии строки ABC - QWERT 01 ДВ 1 2 3 4 5

  1. Строка всегда начинается с трех символов.
  2. Тире не является обязательным
  3. тогда будет 3-10 символов
  4. Заполненные слева цифры 0–99
  5. суффикс состоит из 2 символов и является необязательным.

Ожидаемый результат

1. ['ABC','-','QWERT','01']
1. ['ABC','-','QWERT','01', 'DV']
1. ['ABC','QWER','01','DV']

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

Узор 1: r"([ -?, \d{2}])+" Это работает, но не разбивает строку на первые три символа, если тире отсутствует.

Схема 2: r"([^[a-z]{3}, -?, \d{2}])+" Это не соответствует шаблону, ничего не разделяется.

Узор 3: r"([^[a-z]{3}|-?, \d{2}])+" Это не соответствует шаблону, ничего не разделяется.

Есть какие-нибудь советы или предложения?

Я заменил ваш тег Python 2.7 неверсионным тегом Python, который в любом случае должен присутствовать. Я предполагаю, что версия 2.7 была просто глюком. Если нет, обратите внимание, что Python 2.7 не поддерживается с 2020 года. Больше даже нет обновлений безопасности.

Friedrich 25.06.2024 18:55

к сожалению, я все еще использую Python 2.7 :( Вообще-то Jython. молись за меня

Drewdin 25.06.2024 20:51

Поскольку в вашем вопросе нет ничего конкретного о Python 2.7, давайте все сделаем вид, что ничего не знаем, и продолжим, как будто ничего не произошло...

Friedrich 25.06.2024 20:55

@Drewdin по поводу вашего последнего комментария к удаленному вопросу, проверьте документацию на наличие like, хотя регулярного выражения нет, есть и другие варианты, в том числе возможность ограничиться только числовыми символами или отдельными символами и т. д. Попробуйте, и если сможете Не могу заставить это работать, опубликуйте новый вопрос (после поиска, потому что существует много вопросов такого рода).

Dale K 03.07.2024 05:26
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать шаблон, похожий на:

(?i)([A-Z]{3})(-?)([A-Z]*)([0-9]{2})([A-Z]*)

Код:

import re


def _parts(s):
    p = r'(?i)([A-Z]{3})(-?)([A-Z]*)([0-9]{2})([A-Z]*)'
    return re.findall(p, s)


print(_parts('ABC-QWERT01DV'))
print(_parts('ABCQWER01'))
print(_parts('ABC-QWERT01'))

Принты

[('ABC', '-', 'QWERT', '01', 'DV')]
[('ABC', '', 'QWER', '01', '')]
[('ABC', '-', 'QWERT', '01', '')]

Примечания:

  • (?i): нечувствительный флаг.
  • ([A-Z]{3}): захватите группу 1 любыми 3 буквами.
  • (-?): захватите группу 2 с помощью необязательного тире.
  • ([A-Z]*): захватите группу 3, содержащую 0 или более букв.
  • ([0-9]{2}): захватить группу 4 с помощью 2 цифр.
  • ([A-Z]*): захватите группу 5, содержащую 0 или более букв.

Спасибо, это сработало. Если возможно, можете ли вы обновить свой пост и помочь мне понять, как он работает? в худшем случае я смогу поискать в Google параметры, я ценю это!

Drewdin 25.06.2024 18:30

второй вопрос: вы предпочитаете findall, а не Split?

Drewdin 25.06.2024 18:32

@Drewdin Обновлено. Вы также можете просто изменить группы и сделать так, как хотите. re.findall() здесь подойдет и его легко использовать, но вы можете использовать split().

user24714692 25.06.2024 18:33

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