有没有办法对字符串进行子串?

Joa*_*nge 1995 python string

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

也许喜欢myString[2:end]

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

Pao*_*ino 2987

>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'
Run Code Online (Sandbox Code Playgroud)

Python将这个概念称为"切片",它不仅仅是字符串.看看这里的全面介绍.


End*_*age 370

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

some_string[::-1]
Run Code Online (Sandbox Code Playgroud)

或者选择替代字符将是:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"
Run Code Online (Sandbox Code Playgroud)

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

  • @mtahmed绝对与问题有关.如果您想通过从字符串中选择替换字符来进行子串,该怎么办?那将是my_string [:: 2] (19认同)
  • 当然,选择替代字符的具体示例可能与问题无关,但理解切片的第三个参数非常相关,并且简单的示例用于说明它是如何工作的。Python 社区在以友好的方式教育新成员方面也有着悠久的历史:-) (2认同)

Mic*_*eon 114

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

s = Substr(s, beginning, LENGTH)
Run Code Online (Sandbox Code Playgroud)

所以参数是beginningLENGTH.

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

s = s[ beginning : beginning + LENGTH]
Run Code Online (Sandbox Code Playgroud)

  • 初学者在学习python的时候应该学习pythonic方式,而不是坚持其他语言习惯 (64认同)
  • 只是为了完整性,Java就像Python一样,其中String.substring()方法采用start-past-end。这一点让我很难受,我以为它像世界上所有其他子字符串函数一样长。 (2认同)
  • 一种(可能)更Python化的方式是s [beginning:] [:length]` (2认同)
  • 作为一个开始使用 Python 而不是像 PHP 这样的语言的人,我认为 Python 的字符串 [beginning:end] 更加简单和直观。长度通常无关紧要。 (2认同)

小智 54

实现此目的的常用方法是通过字符串切片.

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


gim*_*mel 23

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

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>
Run Code Online (Sandbox Code Playgroud)

这是创建序列类型副本(不是实习字符串)的常用习惯用法[:].浅复制一个列表,看看没有明显原因使用的Python列表切片语法.

  • 这几乎与关于子串的问题无关.甚至不适用于字符串.说stringA = stringB就够了...... (11认同)
  • 试图总结这个答案的其他批评:在 Python 中,字符串是不可变的,因此没有理由复制字符串 - 所以 `s[:]` 根本不复制:`s = 'ab'; s0 = s[:]; 断言 s 是 s0`。是的,这是在 Python 中复制列表的惯用方法,直到列表获得 `list.copy`,但是不可变类型的完整切片没有理由进行复制,因为它无法更改,所以也可能有内存中只有一个,我们不应该浪费时间复制它。由于这个答案是错误的,**甚至没有回答问题** - 应该删除它吗? (3认同)
  • [:] 完整副本创建一个新副本,使用切片语法并读取为“从头到尾的子字符串” (2认同)
  • 字符串是不可变的是什么意思?`a = b`就足够了. (2认同)

Aar*_*all 18

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

也许喜欢myString[2:end]

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

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'
Run Code Online (Sandbox Code Playgroud)

切片表示法有3个重要参数:

  • 开始

没有给出它们的默认值是None- 但我们可以明确地传递它们:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'
Run Code Online (Sandbox Code Playgroud)

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

是的,例如:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'
Run Code Online (Sandbox Code Playgroud)

请注意,我们在切片中包含start,但我们只会停止,而不是包括停止.

当step为时None,默认情况下切片1用于该步骤.如果你使用负整数,Python就足够聪明,从最后到开头.

>>> myString[::-1]
'0987654321'
Run Code Online (Sandbox Code Playgroud)

我在解释切片符号问题的答案中详细解释了切片符号.


Bab*_*pha 11

text = "StackOverflow"
#using python slicing, you can get different subsets of the above string

#reverse of the string
text[::-1] # 'wolfrevOkcatS' 

#fist five characters
text[:5] # Stack'

#last five characters
text[-5:] # 'rflow'

#3rd character to the fifth character
text[2:5] # 'ack'

#characters at even positions
text[1::2] # 'tcOefo'
Run Code Online (Sandbox Code Playgroud)


小智 10

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 '


Run Code Online (Sandbox Code Playgroud)

  • 我喜欢你列出选项的方法。不过,您的两个选择似乎是相同的? (2认同)

bou*_*ard 8

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

new_sub_string = myString[2:]
Run Code Online (Sandbox Code Playgroud)

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


Cop*_*eIt 8

如果包含的myString开始于偏移6和长度为9帐号,然后就可以提取账户号码是这样的:acct = myString[6:][:9]

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

myString[2:][:999999]
Run Code Online (Sandbox Code Playgroud)

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


Eds*_*ior 7

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


ost*_*ach 6

我想在讨论中加两点:

  1. 您可以None在空白空间中使用以指定"从开头"或"到结尾":

    'abcde'[2:None] == 'abcde'[2:] == 'cde'
    
    Run Code Online (Sandbox Code Playgroud)

    这在函数中特别有用,在这些函数中,您不能提供空格作为参数:

    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]
    
    Run Code Online (Sandbox Code Playgroud)
  2. Python有切片对象:

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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

 >>>myString[2:end]
 'llo'
Run Code Online (Sandbox Code Playgroud)

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

 >>>myString[:end]
 'Hello' 
Run Code Online (Sandbox Code Playgroud)

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

 >>>myString[end]
 ' '
Run Code Online (Sandbox Code Playgroud)