#python #regex #re
#python #регулярное выражение #python-re
Вопрос:
У меня есть столбец, который содержит такие значения, как:
7D
13M
24D
55D
Я хочу разделить значения на группу цифр, а другую — на букву, чтобы я мог продолжить оценку.
Я довольно близок к использованию встроенного регулярного выражения с помощью этой функции
def string_split(type: str):
res = re.findall(('d '), type)
if ["d"] in res:
return "days"
if ["m"] in res:
return "months"
прямо сейчас my re.findall
возвращает только цифры, а не буквы.
Комментарии:
1. Почему вы ожидаете, что он вернет буквы?
d
совпадают только цифры.2. Всегда ли последний символ будет буквой?
3. Ваши строки представлены только в формате numbers-then-D-или-M? Было бы излишним использовать для этого регулярное выражение, и вы могли бы просто сделать
numbers, letter = int(s[:-1]), s[-1]
4. Рассмотрим
d [md]
. Это имеет дополнительное преимущество, заключающееся в сопоставлении только в том случае, если у вас есть символ и цифра.
Ответ №1:
Не используйте re.findall()
. Ваши строки всегда представляют собой число, за которым следует буква. Поэтому используйте регулярное выражение, которое соответствует только этому шаблону, а не его разделению.
def string_split(type: str):
m = re.match('(d )([A-Z])', type)
if m:
num = m.group(1)
unit = m.group(2)
if unit == 'D':
return num, 'days'
elif unit == 'M':
return num, 'months'
else:
raise ValueError('Invalid unit ' unit)
else:
raise ValueError('Invalid interval ' type)
Комментарии:
1. Привет, @Barmar, Мино
typo
? Должно быть — если единица==
измерения ‘D’2. Да, даже опытные программисты не застрахованы от этой ошибки.