如何在 Python 中获取字符串的子字符串?

有没有一种方法可以在 Python 中为字符串加上字符串,以从第三个字符到字符串的末尾获取新的字符串?

也许像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 称这个概念为 “切片”,它不仅适用于字符串,还适用于更多的领域。 在这里查看全面介绍。

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

some_string[::-1]

或选择其他字符为:

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

在字符串中前进和后退的能力保持了从头到尾排列切片的一致性。

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

s = Substr(s, beginning, LENGTH)

因此参数为beginningLENGTH

但是 Python 的行为是不同的。它期望从开始到结束(!)。 初学者很难发现这一点。因此,正确替换 Substr(s,Beginning,LENGTH)是

s = s[ beginning : beginning + LENGTH]

实现此目的的一种常见方法是通过字符串切片。

MyString[a:b]为您提供了从索引 a 到(b-1)的子字符串。

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

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

这是用于创建序列类型(而不是插入字符串) [:]的副本的常见用法。浅表复制列表,请参阅无明显原因的 Python 列表切片语法

有没有一种方法可以在 Python 中为字符串加上字符串,以从第 3 个字符到字符串的末尾获取新的字符串?

也许像myString[2:end]

是的,如果您将名称end分配或绑定到常量单例, None ,这实际上是可行的:

>>> 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'

请注意,我们在切片中包括了开始,但是我们仅向上(不包括)停止了。

当 step 为None ,默认情况下,切片将1用作步骤。如果使用负整数作为步长,则 Python 足够聪明,可以从头到尾进行操作。

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

我在对 “解释切片符号问题” 的回答中会详细解释切片符号。

除了 “结束”,您已经准备就绪。这称为切片符号。您的示例应为:

new_sub_string = myString[2:]

如果省略第二个参数,则它隐式为字符串的结尾。

我想在讨论中添加两点:

  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 具有切片对象:

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

如果 myString 包含以偏移量 6 开始且长度为 9 的帐号,则可以通过以下方式提取帐号: acct = myString[6:][:9]

如果 OP 接受,他们可能想尝试一下,

myString[2:][:999999]

它可以正常工作 - 不会引发任何错误,也不会发生默认的 “字符串填充”。

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

由于尚未允许我发表评论,因此让我在这里添加我的结论。我确定访问此页面时,我不是唯一对此感兴趣的人:

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

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

如果您离开第一部分,您会得到

>>>myString[:end]
 'Hello'

如果在中间也留下了:,则会得到最简单的子字符串,它是第 5 个字符(计数从 0 开始,因此在这种情况下为空白):

>>>myString[end]
 ' '