【问题标题】:How to substring a string Python from a specific index in Python?如何从 Python 中的特定索引中对字符串 Python 进行子串化?
【发布时间】:2017-05-17 08:04:10
【问题描述】:

在 Python 中从特定字符开始对字符串进行子串化的最佳方法是什么?

例如val = "s2*20",如何获取val*之后的子串。结果应该是res = 20

PS:我们假设所有字符串都包含不同长度的*。但是,我们不知道* 的确切索引。

【问题讨论】:

  • 你还在纠结什么,寻找星号的索引,还是截取一段字符串?
  • 可能有一个字符串s2**20***word 吗?结果应该是什么?
  • 您应该定义最佳方式的含义。最快的?最少的代码?要求最好的东西通常涉及意见......
  • @ChristianKönig 最佳方式意味着最快

标签: python string


【解决方案1】:
>>> val = 's2*20'
>>> val.split('*')[1]
'20'

根据您的需要,您可能需要检查字符串中的'*',或者只是在第一次出现'*' 之后获取所有内容,但如果没有更多信息很难猜测。这可能是一个合理的场景:

>>> def rest(s):
...     return s.split('*',1) if '*' in s else s
...
>>> rest('hi')
'hi'
>>> rest('hi there * wazzup * man')
['hi there ', ' wazzup * man']

编辑:正如@Jon(不,不是Skeet)在评论中指出的那样,使用partition 在各方面都更好。

>>> val = 's2*20'
>>> val.partition('*')[2]
'20'
>>> val = 's2-20'
>>> val.partition('*')[2]
''

它更流畅并且性能出乎意料好 - 实际上比split好得多:

>>> import timeit
>>> timeit.timeit('"s2*20".split("*")')
0.22846507105495942
>>> timeit.timeit('"s2-20".split("*")')
0.1685205617091654
>>> timeit.timeit('"s2*20".partition("*")')
0.1475598294296372
>>> timeit.timeit('"s2-20".partition("*")')
0.09512975462482132

【讨论】:

  • val.partition('*')[2] 更安全,因为它可以保证在未提供拆分字符的情况下索引查找不会失败(您将得到一个空字符串)并且更高效最多隐式拆分一次...
  • rest 函数的问题在于它现在执行包含测试,对于分隔符接近末尾或不存在的位置是不必要的操作。 str.partition 为您避免所有这些...
  • @JonClements:我从来没有听说过partition,我认为它是相当新的或晦涩的,但看看它从 2.5 开始就存在了。您完全正确,这是一个更好的解决方案,会记住永远使用分区,谢谢!
  • 为了让时间稍微更公平和等价 - 您可能希望提供最大拆分参数(例如 1)
  • 这正是我想要的。谢谢!
【解决方案2】:

在这种特定情况下:

val[val.index('*')+1:]

找到*的第一个出现位置,并从那里取一个切片。

或:

val.split('*', 1)[-1]

如果您想要第一个 * 之后的所有内容,则只使用分隔符将字符串拆分一次。

【讨论】:

    【解决方案3】:

    您可以使用str.index 获取星号的索引,然后使用索引对完整字符串进行子串化。

    s = "s2*20"
    ind = s.index('*')
    substring = s[ind+1:]
    

    【讨论】:

      【解决方案4】:

      如果你得到一个像 var="sss*s*20" 这样的字符串,你想要哪个 *? 如果你有一个准确的字符串中 * 序列的索引,我认为这可能是这样的:

          string_test = "var num=s*s*t*15"
          # In case you want the substring after the last * 
          sub_string = string_test[string_test.rindex('*') + 1:] 
          print sub_string
      

      【讨论】:

        【解决方案5】:

        使用str.split

        >>> val = "s2*20"
        >>> res = val.split("*")[1]
        >>> res
        '20'
        

        使用str.index

        >>> val[val.index("*")+1:]
        '20'
        

        使用re.findall

        >>> re.findall("\*(\d+)", val)[0]
        '20'
        

        【讨论】:

          【解决方案6】:

          如果您确定该字符在字符串中,那么我最常使用的字符如下所示:

          mystring=mystring[mystring.find('*'):]
          

          这将从该字符开始分割您的字符串,而无需创建额外的数据结构

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-12-04
            • 2019-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-25
            • 1970-01-01
            相关资源
            最近更新 更多