如何在 Python 中获取字符串的子字符串?
Posted
技术标签:
【中文标题】如何在 Python 中获取字符串的子字符串?【英文标题】:How do I get a substring of a string in Python? 【发布时间】:2010-10-14 08:56:20 【问题描述】:有没有办法在 Python 中对字符串进行子串化,以获取从第三个字符到字符串末尾的新字符串?
也许像myString[2:end]
?
如果离开第二部分意味着'直到最后',如果你离开第一部分,它是否从头开始?
【问题讨论】:
这个有明确的解释pythoncentral.io/cutting-and-slicing-strings-in-python 【参考方案1】:>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'
Python 将此概念称为“切片”,它不仅仅适用于字符串。全面介绍一下here。
【讨论】:
【参考方案2】:只是为了完整性,因为没有其他人提到它。数组切片的第三个参数是一个步骤。所以反转一个字符串就这么简单:
some_string[::-1]
或者选择替代字符是:
"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"
在字符串中前进和后退的能力与能够从开头或结尾排列切片保持一致。
【讨论】:
@mtahmed 与问题绝对相关。如果您想通过从字符串中选择替代字符来进行子字符串化怎么办?那将是 my_string[::2] 我认为您更可能想提及切片的第三个参数。需要从字符串中获取所有其他字符可能是某个地方的重要用例,但我从来没有这样做过。并不是说想要炫耀你所知道的有什么不对——如果你不能那样做,那么了解事情的意义何在。 :) 但是与问题相关的情况被夸大了。 当然,选择替代字符的具体示例可能与问题无关,但了解切片的第三个参数非常相关,简单示例用于说明其工作原理。 Python 社区在以友好的方式教育新成员方面也有着悠久的历史:-) 很明显,如果你把 some_string[::-1] 你回来了,字符串的顺序是相反的。但是,我真的不明白你在这种情况下用其他数字做什么?例如:test_string[5:1:-1] - 会产生与我预期完全不同的方式。如果第三个数字是“-1”,第一个和第二个数字将如何影响字符串?【参考方案3】:Substr() 通常(即 php 和 Perl)以这种方式工作:
s = Substr(s, beginning, LENGTH)
所以参数是beginning
和LENGTH
。
但是 Python 的行为是不同的;它期望开始和 END (!) 之后的一个。 这对于初学者来说很难发现。 所以正确替换 Substr(s, beginning, LENGTH) 是
s = s[ beginning : beginning + LENGTH]
【讨论】:
初学者在迁移到python时应该学习pythonic的方式,不要拘泥于其他语言习惯 为了完整起见,Java 与 Python 的相似之处在于 String.substring() 方法需要开始和过去结束。这个让我很难受,我以为它和世界上所有其他子字符串函数一样都是长度。 一个(可能)更pythonic的方法是s[beginning:][:length]
作为一个开始使用 Python 而不是像 PHP 这样的 [脏字] 语言的人,我认为 Python 的字符串 [beginning:end] 更加简单和直观。长度通常无关紧要。【参考方案4】:
实现此目的的常用方法是字符串切片。
MyString[a:b]
为您提供从索引 a 到 (b - 1) 的子字符串。
【讨论】:
【参考方案5】:这里似乎缺少一个示例:完整(浅)副本。
>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>
这是创建序列类型(不是内部字符串)副本的常用习惯用法,[:]
。浅拷贝列表,见Python list slice syntax used for no obvious reason。
【讨论】:
这和子串的问题几乎没有关系。甚至不适用于字符串。说 stringA = stringB 就足够了... [:] 完整副本创建一个 NEW COPY,使用切片语法并被读取为“从头到尾的子字符串” 字符串不可变有什么意义?a=b
应该足够了。
@gimel:实际上,不可变类型上的[:]
根本不会复制。当mysequence
是像str
、tuple
、bytes
(Py3) 或unicode
(Py2) 或unicode
(Py2) 等不可变类型时,mysequence[:]
基本上是无害的,a = b[:]
相当于a = b
,它只是浪费一点时间来调度对象通过返回自身来响应的切片字节码,因为它对浅拷贝毫无意义,除了对象身份测试之外,它相当于只返回另一个对一个不可变自身的引用。
试图总结对这个答案的其他批评:在 Python 中,字符串是不可变的,因此没有理由复制字符串 - 所以 s[:]
不会在全部:s = 'abc'; s0 = s[:]; assert s is s0
。是的,这是在 Python 中复制列表的惯用方式,直到列表获得 list.copy
,但是不可变类型的完整切片没有理由进行复制,因为它无法更改,所以可能只有一个在内存中,我们不应该浪费时间复制它。由于这个答案是错误的并且甚至没有回答问题 - 是否应该将其删除?【参考方案6】:
有没有办法在 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'
请注意,我们在 slice 中包含 start,但我们只上升,而不包括 stop。
当 step 为 None
时,默认情况下 slice 使用 1
作为 step。如果你使用负整数,Python 足够聪明,可以从头到尾。
>>> myString[::-1]
'0987654321'
我在my answer to Explain slice notation Question.中详细解释了切片符号
【讨论】:
【参考方案7】:除了“end”之外,你已经明白了。它被称为切片符号。您的示例应为:
new_sub_string = myString[2:]
如果省略第二个参数,则默认为字符串的结尾。
【讨论】:
【参考方案8】:我想在讨论中补充两点:
您可以在空白处使用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]
Python 有 slice 对象:
idx = slice(2, None)
'abcde'[idx] == 'abcde'[2:] == 'cde'
【讨论】:
【参考方案9】:如果 myString 包含从偏移量 6 开始且长度为 9 的帐号,那么您可以通过以下方式提取帐号:acct = myString[6:][:9]
。
如果 OP 接受这一点,他们可能想以实验方式尝试,
myString[2:][:999999]
它可以工作 - 不会引发错误,并且不会发生默认的“字符串填充”。
【讨论】:
我想如果你想在OP的情况下使用这种方法myString[offset:][:length]
你可以使用myString[offset:][:]
@VictorVal 答案适用于那些(像我一样)已经将 Python 作为第二(第三、第四、...)编程语言并希望使用一些熟悉的“语法挂钩”来接近该语言的人.该语言的任何专家很可能会认为我的回答有点愚蠢。
应该将这样的答案标记为删除吗?其他答案更好地解释了类似的解决方案,看到这个让我挠头并查找 python 几分钟,然后才意识到这只是那种类型的答案。【参考方案10】:
嗯,我遇到了一个需要将 PHP 脚本翻译成 Python 的情况,它有很多 substr(string, beginning, LENGTH)
的用法。
如果我选择 Python 的string[beginning:end]
,我必须计算很多的结束索引,所以更简单的方法是使用string[beginning:][:length]
,它为我省去了很多麻烦。
【讨论】:
【参考方案11】:也许我错过了它,但我无法在此页面上找到原始问题的完整答案,因为此处未进一步讨论变量。所以我不得不继续寻找。
由于我还不能发表评论,所以让我在这里添加我的结论。访问此页面时,我确定我不是唯一对此感兴趣的人:
>>>myString = 'Hello World'
>>>end = 5
>>>myString[2:end]
'llo'
如果你离开第一部分,你会得到
>>>myString[:end]
'Hello'
如果你把 : 也放在中间,你会得到最简单的子字符串,它是第 5 个字符(从 0 开始计数,所以在这种情况下它是空白):
>>>myString[end]
' '
【讨论】:
【参考方案12】:使用硬编码索引本身就很麻烦。
为了避免这种情况,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 可以获得可读性。
【讨论】:
也许这不是最好的例子,因为硬编码的索引仍然存在,并且可读性来自中间变量,你可以在第一个例子中使用。【参考方案13】: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 '
【讨论】:
我喜欢你列出选项的方法。不过,您的两个选项似乎相同?【参考方案14】: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 开始。
【讨论】:
【参考方案15】:我有一个更简单的解决方案,使用 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")
【讨论】:
以上是关于如何在 Python 中获取字符串的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章