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

我想从第三个字符到字符串末尾获取一个新字符串,例如myString[2:end]。如果省略第二部分意味着“直到结束”,如果省略第一部分,它是否从头开始?

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

Python将这个概念称为“切片”,它不仅仅适用于字符串。查看这里以获得全面的介绍。

除了“end”之外,你已经得到了它。它被称为切片符号。您的示例应该是:

new_sub_string = myString[2:]

如果省略第二个参数,则它隐含地是字符串的末尾。

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

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

这是创建序列类型(而不是内部字符串)副本的常见习惯用法,[:]。浅拷贝列表,请参阅Python列表切片语法没有明显的原因

实现这一点的一种常见方法是字符串切片。

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

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

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,开始, LENGTH)的正确替换是

s = s[ beginning : beginning + LENGTH]

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

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

 >>>myString = 'Hello World'>>>end = 5
>>>myString[2:end]'llo'

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

 >>>myString[:end]'Hello'

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

 >>>myString[end]' '

我想在讨论中补充两点:

  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 has slice objects:

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

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

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

使用切片你获得易读性。

有没有办法在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'

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

当步骤为None时,默认情况下切片使用1作为步骤。如果您使用负整数执行步骤,Python足够聪明,可以从末尾到开头。

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

我在我对解释切片符号问题的回答。中详细解释了切片表示法

如果myString包含一个从偏移量6开始且长度为9的帐号,那么您可以这样提取帐号:acct = myString[6:][:9]

如果OP接受这一点,他们可能想尝试,以实验的方式,

myString[2:][:999999]

它工作-没有错误被提出,并且没有默认的字符串填充发生。

嗯,我遇到了需要将PHP脚本翻译成Python的情况,它有很多substr(string, beginning, LENGTH)的用法。
如果我选择Python的string[beginning:end],我必须计算很多的结束索引,所以更简单的方法是使用string[beginning:][:length],它节省了我很多麻烦。

a="Helloo"print(a[:-1])

在上面的代码中,[:-1]声明从开始打印到最大限制-1。

输出:

>>> Hello

注意:这里a[:-1]也与a[0:-1]和a[0: len(a)-1]相同

a="I Am Siva"print(a[2:])

输出:

>>> Am Siva

在上面的代码中,a[2:]声明从索引2到最后一个元素打印a。

请记住,如果您将打印字符串的最大限制设置为(x),那么它将打印字符串直到(x-1),并且还请记住列表或字符串的索引将始终从0开始。

str1='There you are'>>> str1[:]'There you are'
>>> str1[1:]'here you are'
#To print alternate characters skipping one element in between
>>> str1[::2]'Teeyuae'
#To print last element of last two elements>>> str1[:-2:-1]'e'
#Similarly>>> str1[:-2:-1]'e'

#Using slice datatype
>>> str1='There you are'>>> s1=slice(2,6)>>> str1[s1]'ere '

我有一个更简单的解决方案,使用for循环在字符串中查找给定的子字符串。假设我们有两个字符串变量,

main_string = "lullaby"match_string = "ll"

如果您想检查给定的匹配字符串是否存在于主字符串中,您可以这样做,

match_string_len = len(match_string)for index,value in enumerate(main_string):sub_string = main_string[index:match_string_len+index]if sub_string == match_string:print("match string found in main string")
text = "StackOverflow"#using python slicing, you can get different subsets of the above string
#reverse of the stringtext[::-1] # 'wolfrevOkcatS'
#fist five characterstext[:5] # Stack'
#last five characterstext[-5:] # 'rflow'
#3rd character to the fifth charactertext[2:5] # 'rflow'
#characters at even positionstext[1::2] # 'tcOefo'