Манипуляция строками нотных обозначений
Есть ли способ манипулировать строкой в Python, используя следующие способы?
Для любой строки, которая хранится в точечной нотации, например:
s = "classes.students.grades"
Есть ли способ изменить строку на следующее:
"classes.students"
В принципе, удалите все, вплоть до последнего периода. Итак, "restaurants.spanish.food.salty"
станет "restaurants.spanish.food"
.
Кроме того, есть ли способ определить, что происходит после последнего периода? Причина, по которой я хочу это сделать, - это использовать isDigit()
.
Итак, если это было classes.students.grades.0
, я мог каким-то образом захватить 0
, поэтому я мог бы использовать оператор if с isdigit
и сказать, если часть строки после последнего периода (так 0
в этот случай) представляет собой цифру, удалите ее, в противном случае оставьте ее.
Ответы
Ответ 1
вы можете использовать split
и join
вместе:
s = "classes.students.grades"
print '.'.join(s.split('.')[:-1])
Вы разбиваете строку на .
- она даст вам список строк, после чего вы присоедините элементы списка к строке, разделяющей их на .
[:-1]
выберет все элементы из списка, но последний
Чтобы проверить, что происходит после последнего .
:
s.split('.')[-1]
Другой способ - использовать rsplit
. Он работает так же, как split, но если вы укажете параметр maxsplit, он разделит строку, начиная с конца:
rest, last = s.rsplit('.', 1)
'classes.students'
'grades'
Вы также можете использовать re.sub
, чтобы заменить часть после последней .
пустой строкой:
re.sub('\.[^.]+$', '', s)
И последняя часть вашего вопроса, чтобы обернуть слова в []
, я бы рекомендовал использовать format
и list comprehension
:
''.join("[{}]".format(e) for e in s.split('.'))
Он даст вам желаемый результат:
[classes][students][grades]
Ответ 2
Лучший способ сделать это - использовать метод rsplit
и передать аргумент maxsplit
.
>>> s = "classes.students.grades"
>>> before, after = s.rsplit('.', maxsplit=1) # rsplit('.', 1) in Python 2.x onwards
>>> before
'classes.students'
>>> after
'grades'
Вы также можете использовать метод rfind()
с нормальной работой среза.
Чтобы получить все до последнего .
:
>>> s = "classes.students.grades"
>>> last_index = s.rfind('.')
>>> s[:last_index]
'classes.students'
Затем все после последнего .
>>> s[last_index + 1:]
'grades'
Ответ 3
если '.' in s
, s.rpartition('.')
находит последнюю точку в s
,
и возвращает (before_last_dot, dot, after_last_dot)
:
s = "classes.students.grades"
s.rpartition('.')[0]
Ответ 4
Если ваша цель - избавиться от конечного компонента, всего лишь одной цифры, начните и завершите с помощью re.sub()
:
s = re.sub(r"\.\d$", "", s)
Это выполнит задание и оставит остальные строки в покое. Не нужно возиться ни с чем другим.
Если вы хотите узнать об общем случае (отделите последний компонент, независимо от того, что это такое), используйте rsplit
, чтобы разделить строку:
>>> "hel.lo.there".rsplit(".", 1)
['hel.lo', 'there']
Если в строке нет точки, вы просто получите один элемент в своем массиве, всю строку.
Ответ 5
Вы можете сделать это очень просто с помощью rsplit (str.rsplit([sep[, maxsplit]]
), который вернет список, разбив каждый элемент вдоль данного разделителя.
Вы также можете указать, сколько разделов должно быть выполнено:
>>> s = "res.spa.f.sal.786423"
>>> s.rsplit('.',1)
['res.spa.f.sal', '786423']
Итак, конечная функция, которую вы описываете:
def dimimak_cool_function(s):
if '.' not in s: return s
start, end = s.rsplit('.', 1)
return start if end.isdigit() else s
>>> dimimak_cool_function("res.spa.f.sal.786423")
'res.spa.f.sal'
>>> dimimak_cool_function("res.spa.f.sal")
'res.spa.f.sal'