Я знаю, что на этот вопрос был дан ответ, но мой вариант использования немного другой. Я пытаюсь настроить шаблон регулярного выражения, чтобы разделить несколько строк на список.
Входные строки:
1. "ABC-QWERT01"
2. "ABC-QWERT01DV"
3. "ABCQWER01"
Критерии строки ABC - QWERT 01 ДВ 1 2 3 4 5
Ожидаемый результат
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 :( Вообще-то Jython. молись за меня
Поскольку в вашем вопросе нет ничего конкретного о Python 2.7, давайте все сделаем вид, что ничего не знаем, и продолжим, как будто ничего не произошло...
@Drewdin по поводу вашего последнего комментария к удаленному вопросу, проверьте документацию на наличие like
, хотя регулярного выражения нет, есть и другие варианты, в том числе возможность ограничиться только числовыми символами или отдельными символами и т. д. Попробуйте, и если сможете Не могу заставить это работать, опубликуйте новый вопрос (после поиска, потому что существует много вопросов такого рода).
Вы можете использовать шаблон, похожий на:
(?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 параметры, я ценю это!
второй вопрос: вы предпочитаете findall, а не Split?
@Drewdin Обновлено. Вы также можете просто изменить группы и сделать так, как хотите. re.findall()
здесь подойдет и его легко использовать, но вы можете использовать split()
.
Я заменил ваш тег Python 2.7 неверсионным тегом Python, который в любом случае должен присутствовать. Я предполагаю, что версия 2.7 была просто глюком. Если нет, обратите внимание, что Python 2.7 не поддерживается с 2020 года. Больше даже нет обновлений безопасности.