簡體   English   中英

如何在 Python 中獲取字符串的 substring?

[英]How do I get a substring of a string in Python?

我想從第三個字符到字符串末尾獲取一個新字符串,例如myString[2:end] 如果省略第二部分意味着“直到最后”,如果省略第一部分,它是否從頭開始?

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

Python 將此概念稱為“切片”,它不僅僅適用於字符串。 在這里查看一個全面的介紹。

只是為了完整性,因為沒有其他人提到它。 數組切片的第三個參數是一個步驟。 所以反轉一個字符串很簡單:

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 的行為是不同的; 它期望開始和 END (.) 之后的一個。 這是初學者很難發現的。 所以 Substr(s, beginning, LENGTH) 的正確替換是

s = s[ beginning : beginning + LENGTH]

實現此目的的常用方法是字符串切片。

MyString[a:b]為您提供從索引 a 到 (b - 1) 的 substring。

這里似乎缺少一個示例:完整(淺)副本。

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

這是創建序列類型(不是內部字符串)副本的常見習慣用法[:] 淺拷貝列表,請參閱Python 列表切片語法使用無明顯原因

有沒有辦法在 Python 中 substring 一個字符串,從第 3 個字符到字符串末尾獲取一個新字符串?

也許像myString[2:end]

是的,如果您將名稱end分配或綁定到常量 singleton, None ,這實際上是有效的:

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

切片符號有 3 個重要的 arguments:

  • 開始
  • 停止

沒有給出它們的默認值是None - 但我們可以明確地傳遞它們:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

如果離開第二部分意味着“直到最后”,如果你離開第一部分,它是否從頭開始?

是的,例如:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

請注意,我們在 slice 中包含了 start,但我們僅 go 直到且不包括 stop。

當 step 為None時,默認情況下切片使用1作為 step。 如果您使用否定的 integer,則 Python 足夠聰明,可以從頭到尾 go。

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

我在對解釋切片符號問題的回答中非常詳細地解釋了切片符號。

除了“結束”之外,你已經得到了它。 它被稱為切片符號。 您的示例應為:

new_sub_string = myString[2:]

如果省略第二個參數,則它隱含地是字符串的結尾。

我想在討論中補充兩點:

  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'

如果 myString 包含從偏移量 6 開始且長度為 9 的帳號,那么您可以通過以下方式提取帳號: acct = myString[6:][:9]

如果 OP 接受這一點,他們可能想以實驗方式嘗試,

myString[2:][:999999]

它有效 - 不會引發錯誤,也不會發生默認的“字符串填充”。

好吧,我遇到了一種情況,我需要將 PHP 腳本轉換為 Python,它有很多substr(string, beginning, LENGTH)的用法。
如果我選擇 Python 的string[beginning:end]就必須計算很多結束索引,所以更簡單的方法是使用string[beginning:][:length] ,它為我省去了很多麻煩。

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] # 'rflow'

#characters at even positions
text[1::2] # 'tcOefo'
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 '


也許我錯過了它,但我無法在此頁面上找到原始問題的完整答案,因為這里沒有進一步討論變量。 所以我不得不 go 進行搜索。

由於我還不能發表評論,讓我在這里添加我的結論。 訪問此頁面時,我確定我不是唯一對此感興趣的人:

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

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

如果你離開第一部分,你會得到

 >>>myString[:end]
 'Hello' 

如果你在中間留下:你也會得到最簡單的 substring,它是第 5 個字符(從 0 開始計數,所以在這種情況下它是空白):

 >>>myString[end]
 ' '

使用硬編碼索引本身可能是一團糟。

為了避免這種情況,Python 提供了一個內置的 object 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 可以獲得可讀性。

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

在上面的代碼中,[:-1] 聲明從開始打印到最大限制-1。

OUTPUT:

>>> Hello

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

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

OUTPUT:

>>> Am Siva

在上面的代碼中,a [2:] 聲明從索引 2 到最后一個元素打印 a。

請記住,如果您設置打印字符串的最大限制,如 (x),那么它將打印字符串直到 (x-1),並且還要記住列表或字符串的索引將始終從 0 開始。

我有一個更簡單的解決方案,使用for 循環在字符串中查找給定的 substring。 假設我們有兩個字符串變量,

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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM