Манипуляция строками нотных обозначений

Есть ли способ манипулировать строкой в ​​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'