题 有没有办法在Python中对字符串进行子串?


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

也许就像 myString[2:end]

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


1595
2018-03-19 17:29


起源


这个包含一个明确的解释 pythoncentral.io/cutting-and-slicing-strings-in-python - Mario Ruiz


答案:


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

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


2417
2018-03-19 17:30





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

some_string[::-1]

或者选择替代字符将是:

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

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


305
2018-03-20 00:58



@mtahmed绝对与问题有关。如果您想通过从字符串中选择替换字符来进行子字符串怎么办?那将是my_string [:: 2] - Endophage
我认为你更有可能想提到要切片的第三个参数。需要从字符串中获取所有其他字符可能是某个地方的重要用例,但我从来没有这样做过。并不是说想要展示你所知道的东西有什么不妥 - 如果你不能这样做,知道事情的重点是什么。 :)但与此问题相关的案例被夸大了。 - John Lockwood
当然,选择替代字符的具体示例可能与问题无关,但理解有很多切片的第三个参数是相关的,简单的例子用于说明它是如何工作的。 Python社区也有一个以友好的方式教育新成员的伟大历史:-) - Endophage


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

s = Substr(s, beginning, LENGTH)

所以参数是 beginning 和 LENGTH

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

s = s[ beginning : beginning + LENGTH]

92
2017-08-04 11:43



初学者在学习python的时候应该学习pythonic方式,而不是坚持其他语言习惯 - Nicolae Surdu


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


45
2018-03-02 05:19



简单易行。谢谢 - Jacky Supit


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

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

这是创建序列类型副本(不是实习字符串)的常用习惯用法。 [:] 浅拷贝列表,见 蟒蛇列表片使用的换无明显的原因的


17
2018-03-19 18:02



这几乎与关于子串的问题无关。甚至不适用于字符串。说stringA = stringB就够了...... - Nicolae Surdu
[:]完整拷贝创建一个新拷贝,使用切片语法并被读作“从头到尾的子串” - gimel
字符串是不可变的是什么意思? a=b 应该足够了。 - bfontaine
@gimel:实际上, [:] 在不可变类型上根本不制作副本。而 mysequence[:] 什么时候是无害的 mysequence 是一个不可变的类型 str, tuple, bytes (Py3)或 unicode (杆菌Py2), a = b[:] 相当于 a = b它只是浪费一点时间来调度对象响应的切片字节代码,通过返回自己,因为除了对象身份测试之外,它对于浅拷贝是没有意义的,它等同于只返回对一个不可变自我的另一个引用。 - ShadowRanger
试图总结对这个答案的其他批评:在Python中,字符串是不可变的,因此没有理由制作字符串的副本 - 所以 s[:] 根本不复制: s = 'abc'; s0 = s[:]; assert s is s0。是的,这是用Python复制列表直到列表得到的惯用方法 list.copy,但是不可变类型的完整片段没有理由进行复制,因为它无法更改,因此内存中可能只有一个,我们不应该浪费时间复制它。由于这个答案是错误的 甚至没有回答这个问题 - 它应该被删除吗? - Aaron Hall♦


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

我详细解释了切片符号 我对Explain切片符号问题的回答。 


13
2018-06-23 21:53





除了“结束”之外,你已经做到了。它被称为切片表示法。你的例子应该是:

new_sub_string = myString[2:]

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


7
2018-03-19 17:31





我想在讨论中加两点:

  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
2017-08-31 04:28





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

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

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

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

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

 >>>myString[:end]
 'Hello' 

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

 >>>myString[end]
 ' '

2
2018-03-18 12:01





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

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

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


0
2017-08-31 04:50



也许这不是最好的例子,因为硬编码索引仍然存在,可读性来自中间变量,你可以在第一个例子中使用它们。 - ASalazar