提问



有没有办法在Python中对字符串进行子串,以获取从第3个字符到字符串末尾的新字符串?


也许像myString[2:end]?


如果离开第二部分意味着直到最后,如果你离开第一部分,它是从一开始就开始的吗?

最佳参考


>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'


Python将这个概念称为切片,它不仅仅是字符串。看看这里的全面介绍。

其它参考1


只是为了完整性,没有人提到它。数组切片的第三个参数是一个步骤。因此,反转字符串非常简单:


some_string[::-1]


或者选择替代字符将是:


"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"


通过字符串前进和后退的能力可以保持与开始或结束的数组切片的一致性。

其它参考2


Substr()通常(即PHP和Perl)以这种方式工作:


s = Substr(s, beginning, LENGTH)


所以参数是beginningLENGTH


但是Python的行为是不同的;它预期开始,一个在END(!)之后。初学者很难发现。所以正确替换Substr(s,开头,LENGTH)是


s = s[ beginning : beginning + LENGTH]

其它参考3


实现此目的的常用方法是使用字符串切片。 MyString[a:b]为您提供从索引a到(b - 1)的子字符串

其它参考4


这里似乎缺少一个例子:完整(浅)副本。


>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>> 


这是创建序列类型副本(不是实习字符串)的常用习惯用法。 [:]浅复制列表,参见python-list-slice-used-for-no-obvious-reason。

其它参考5



  有没有办法在Python中对字符串进行子串,以获取从第3个字符到字符串末尾的新字符串?

  
  也许像myString[2:end]?



是的,如果您将名称end分配或绑定到常量单例,None:[36],这实际上是有效的


>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'


切片表示法有3个重要参数:



  • 启动

  • 停止

  • 步骤



没有给出它们的默认值是None - 但我们可以明确地传递它们:


>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'



  如果离开第二部分意味着直到最后,如果你离开第一部分,它是从一开始就开始的吗?



是的,例如:


>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'


请注意,我们在切片中包含start,但我们只会停止,而不是包括停止。


当步长为None时,默认情况下,切片使用1作为步骤。如果你使用负整数,Python足够聪明,从最后到开头。


>>> myString[::-1]
'0987654321'


我在解释切片符号问题的答案中详细解释了切片符号。

其它参考6


除了结束之外,你已经把它弄好了。它叫做切片符号。你的例子应该是:


new_sub_string = myString[2:]


如果省略第二个参数,则隐含地表示字符串的结尾。

其它参考7


我想在讨论中加两点:



  1. 您可以在空白处使用None来指定从开头或到结尾:


    'abcde'[2:None] == 'abcde'[2:] == 'cde'
    


    这在函数中特别有用,在这些函数中,您不能提供空格作为参数:


    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
    

  2. Python有切片对象:[38]


    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'
    


其它参考8


也许我错过了,但我无法在这个页面上找到原始问题的完整答案,因为这里没有进一步讨论变量。所以我不得不继续搜索。


由于我还没有被允许发表评论,让我在这里加上我的结论。我确信在访问此页面时我并不是唯一对此感兴趣的人:


 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'


如果你离开第一部分,你就得到了


 >>>myString[:end]
 'Hello' 


如果你离开了:在中间你也得到了最简单的子串,这将是第5个字符(从0开始计数,所以在这种情况下它是空白):


 >>>myString[end]
 ' '

其它参考9


使用硬编码索引本身就是一团糟。


为了避免这种情况,Python提供了一个内置对象slice()


string = "my company has 1000$ on profit, but I lost 500$ gambling."


如果我们想知道剩下多少钱。


正常解决方案


final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500


使用切片:


EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500


使用切片可以获得可读性。