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


2142

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

也许喜欢myString[2:end]吗?

如果离开第二部分意味着“直到最后”,而如果离开第一部分,它是否从头开始?


1
这其中包含一个清晰的解释pythoncentral.io/cutting-and-slicing-strings-in-python
mario

Answers:


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

Python称这个概念为“切片”,它不仅适用于字符串,还适用于更多的领域。看看这里的一个全面的介绍。


401

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

some_string[::-1]

或选择其他字符为:

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

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


21
@mtahmed与问题绝对相关。如果您想通过从字符串中选择其他字符来对字符串进行子字符串化怎么办?那将是my_string [:: 2]
Endophage

我认为您更可能想提及要切片的第三个参数。需要从字符串中获取所有其他字符可能是某个地方的重要用例,但我从来没有这样做。并不是想炫耀自己知道的事有什么问题-如果您做不到,那么了解事情的意义何在。:)但是,与该问题相关的情况被夸大了。
约翰·洛克伍德

1
当然,选择替代字符的特定示例可能与该问题无关,但了解要切成薄片的第三个参数是相关的,并且简单的示例有助于说明其工作原理。Python社区还具有以友好的方式教育新成员的悠久历史:-)
Endophage

127

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

s = Substr(s, beginning, LENGTH)

因此参数为beginningLENGTH

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

s = s[ beginning : beginning + LENGTH]

75
移动到Python时,初学者应该学习Python的方式,不能拘泥于其他语言习惯
Nicu的苏尔

3
只是为了完整性,Java就像Python一样,其中String.substring()方法采用start和last-end作为结束。这一点让我很难受,我以为它像世界上所有其他子字符串函数一样长。
PhilHibbs

4
一种(可能)更有效的方法是s[beginning:][:length]
victortv

2
作为使用Python而不是PHP这样的[脏话]语言的人,我认为Python的字符串[beginning:end]更加简单直观。长度通常不相关。
Gloweye

60

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

MyString[a:b] 给您一个从索引a到(b-1)的子字符串。


23

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

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

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


12
这几乎与有关子字符串的问题无关。甚至不适用于字符串。说stringA = stringB就足够了
Nicu Surdu

2
[:]完整副本创建一个NEW COPY,使用切片语法,并被读取为“
从头到尾的

2
既然字符串是不可变的,那又有什么意义呢?a=b应该足够了。
bfontaine

1
@gimel:实际上,[:]在不可变类型上根本不会复制。而mysequence[:]当大部分是无害的mysequence是不可变的类型一样strtuplebytes(PY 3)或unicode(的Py2),a = b[:]等同于a = b,它只是浪费一点时间调度切片字节代码,对象响应通过返回自身,因为它是毫无意义的浅拷贝时,除了对象身份测试外,它等效于仅返回另一个对自己不变的自我的引用。
ShadowRanger

3
尝试总结对该答案的其他批评:在Python中,字符串是不可变的,因此没有理由制作字符串的副本-因此s[:]根本不会制作副本:s = 'abc'; s0 = s[:]; assert s is s0。是的,这是在Python中复制列表直到列表得到的惯用方式list.copy,但是不可变类型的完整切片没有理由进行复制,因为它无法更改,因此在内存中可能只有一个,并且我们不应该浪费时间复制它。由于此答案是错误的,甚至无法回答问题 -应该删除它吗?
亚伦·霍尔

18

有没有一种方法可以在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'

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


8

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

new_sub_string = myString[2:]

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


6

我想在讨论中添加两点:

  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'

6

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

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

myString[2:][:999999]

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


1
我认为,如果要myString[offset:][:length]在OP的情况下使用此方法,则可以使用myString[offset:][:]
victortv

1
@VictorVal答案是针对(像我一样)已经将Python作为第二(第三,第四,...)编程语言学习的,并希望使用一些熟悉的“语法钩子”来接近该语言的人。任何使用该语言的专家都最有可能认为我的回答有点愚蠢。
CopyPasteIt

应该将这样的答案标记为删除吗?其他答案则更好地解释了类似的解决方案,看到这一解决方案使我scratch了几分钟,然后才开始查找python,然后才意识到这只是那种类型的答案。
塞比

3

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

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

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

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

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

 >>>myString[:end]
 'Hello' 

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

 >>>myString[end]
 ' '

1

好吧,我遇到了需要将PHP脚本转换为Python的情况,并且它有许多用法substr(string, beginning, LENGTH)
如果选择Python,string[beginning:end]则必须计算大量的结束索引,因此更简单的方法是使用string[beginning:][:length],这为我省去了很多麻烦。


0

使用硬编码的索引本身可能是一团糟。

为了避免这种情况,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

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


5
也许这不是最佳示例,因为保留了硬编码索引,并且可读性来自中间变量,您可以在第一个示例中使用中间变量。
ASalazar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.