2472

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

也许喜欢myString[2:end]

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

4

15 回答 15

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

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

于 2009-03-19T17:30:44.780 回答
457

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

some_string[::-1]

或者选择替代字符是:

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

通过字符串向前和向后步进的能力与能够从开头或结尾排列切片保持一致。

于 2012-03-20T00:58:50.573 回答
151

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

s = Substr(s, beginning, LENGTH)

所以参数是beginningLENGTH

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

s = s[ beginning : beginning + LENGTH]
于 2012-08-04T11:43:03.103 回答
72

实现此目的的常用方法是字符串切片。

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

于 2012-03-02T05:19:02.317 回答
28

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

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

这是创建序列类型(不是内部字符串)副本的常见习惯用法,[:]. 浅复制列表,请参阅Python 列表切片语法无明显原因使用

于 2009-03-19T18:02:38.807 回答
23

有没有办法在 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用于 step。如果你使用负整数,Python 足够聪明,可以从头到尾。

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

我在对解释切片符号问题的回答中非常详细地解释了切片符号。

于 2017-06-23T21:53:56.940 回答
11

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

new_sub_string = myString[2:]

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

于 2009-03-19T17:31:34.060 回答
10

我想在讨论中补充两点:

  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'
    
于 2016-08-31T04:28:09.603 回答
8

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

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

myString[2:][:999999]

它有效 - 不会引发错误,也不会发生默认的“字符串填充”。

于 2019-02-17T13:01:50.863 回答
7

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

于 2020-04-29T18:31:46.270 回答
6
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 '


于 2021-03-29T06:18:29.577 回答
5

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

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

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

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

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

 >>>myString[:end]
 'Hello' 

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

 >>>myString[end]
 ' '
于 2015-03-18T12:01:43.047 回答
4

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

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

使用 slice 可以获得可读性。

于 2016-08-31T04:50:52.077 回答
1
a="Helloo"
print(a[:-1])

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

输出 :

>>> Hello

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

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

输出:

>>> Am Siva

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

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

于 2020-07-03T14:26:48.367 回答
0

我有一个更简单的解决方案,使用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")
于 2021-12-22T06:55:27.297 回答