点表示法字符串操作

18

有没有一种方法可以使用以下方式在Python中操作字符串?

例如,对于存储在点符号表示法中的任何字符串:

s = "classes.students.grades"

有没有一种方法可以将字符串更改为以下内容:

"classes.students"

基本上,删除最后一个句点及其之前的所有内容。因此,"restaurants.spanish.food.salty" 将变成 "restaurants.spanish.food"

此外,有没有办法识别最后一个句点后面的内容?我想这样做的原因是我想使用 isDigit()

那么,如果是 classes.students.grades.0 ,我是否能够获取末尾的 0,以便我可以使用一个 isdigit 的if语句,并说如果字符串中最后一个句点后面的部分(在本例中为0)是数字,则删除它,否则保留它。

5个回答

21

你可以一起使用 splitjoin

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)

对于您的问题中最后一个要求,即将单词用 [] 包裹起来,我建议使用 formatlist comprehension

''.join("[{}]".format(e) for e in s.split('.'))

它将为您提供所需的输出:

[classes][students][grades]

2
为什么要费那么多力气,当你可以使用str.rsplit()str.rpartition()最后一个点上进行分割呢? - Martijn Pieters
1
@minitoto:你的方法在所有点上进行分割,需要额外使用 '.'.join()。使用 .rsplit('.', 1)[0] 或更好的 .rpartition('.')[0] 可以在不必再次连接的情况下给出所需的结果。这两种方法还可以给出尾部,即最后一个点之后的部分。 - Martijn Pieters
使用s[:-s.find('.')]来获取最后一个点之前的所有内容,使用s[s.rfind('.')+1:]来获取最后一个点之后的所有内容是有问题的吗? - OriginalCliche

15

最好的方法是使用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'

13
如果字符串 s 中包含 '.'s.rpartition('.') 可以找到最后一个点,并返回一个元组:(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']

如果字符串中没有点,你将只会在数组中得到一个元素,即整个字符串。

0
你可以非常简单地使用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'

其他答案都没有回答isdigit部分。我的是唯一一个提供端到端答案的答案。 - DevShark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接