【问题标题】:Dot notation string manipulation点符号字符串操作
【发布时间】:2016-03-03 08:31:43
【问题描述】:

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

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

s = "classes.students.grades"

有没有办法将字符串更改为以下内容:

"classes.students"

基本上,删除直到最后一个期间的所有内容。所以"restaurants.spanish.food.salty" 会变成"restaurants.spanish.food"

此外,有什么方法可以确定最后一个时期之后的内容吗?我想这样做的原因是我想使用isDigit()

所以,如果它是classes.students.grades.0,我能否以某种方式获取0,这样我就可以使用带有isdigit 的if 语句,并说出最后一个句点之后的字符串部分(所以0 在本例)是一个数字,删除它,否则,留下它。

【问题讨论】:

    标签: python string


    【解决方案1】:

    您可以同时使用splitjoin

    s = "classes.students.grades"
    print '.'.join(s.split('.')[:-1])
    

    您正在拆分. 上的字符串 - 它会给您一个字符串列表,然后您将列表元素加入到用. 分隔它们的字符串中

    [:-1] 将从列表中挑选除最后一个以外的所有元素

    检查最后一个.之后的内容:

    s.split('.')[-1]
    

    另一种方法是使用rsplit。它的工作方式与 split 相同,但如果您提供 ma​​xsplit 参数,它将从末尾开始拆分字符串:

    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]
    

    【讨论】:

    • 当你可以用str.rsplit()str.rpartition()最后一个点分割时,为什么要做这么多工作?
    • @minitoto:您的方法在所有个点上分裂,需要额外的'.'.join()。使用.rsplit('.', 1)[0],或者更好的是,.rpartition('.')[0] 可以为您提供所需的结果,而无需再次加入。这两种方法也会给你尾巴,最后一个点之后的部分。
    • 执行 s[:-s.find('.')] 以获取最后一个 '.' 之前的所有内容有什么问题并做 s[s.rfind('.')+1:] 得到最后一个点之后的一切?
    【解决方案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 ss.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'
          

          【讨论】:

          • 其他答案都没有真正回答关于 isdigit 的部分。我的是唯一提供端到端答案的。
          猜你喜欢
          • 2022-06-11
          • 1970-01-01
          • 2013-05-02
          • 1970-01-01
          • 2022-11-11
          • 2011-05-12
          • 1970-01-01
          相关资源
          最近更新 更多