python 字符串操作方法詳解


  字符串序列用於表示和存儲文本,python中字符串是不可變對象。字符串是一個有序的字符的集合,用於存儲和表示基本的文本信息,一對單,雙或三引號中間包含的內容稱之為字符串。其中三引號可以由多行組成,編寫多行文本的快捷語法,常用文檔字符串,在文件的特定地點,被當做注釋。便捷的多行注釋。

Python實際三類字符串:

  1.通常意義字符串(str)

  2.原始字符串,以大寫R 或 小寫r開始,r'',不對特殊字符進行轉義

  3.Unicode字符串,u'' basestring子類

  python中字符串支持索引、切片操作。

    根據python3.x的字符串源碼文件可見,總共44個方法,查找列出如下:

 

 

 

方法 描述

string.capitalize()

把字符串的第一個字符大寫

string.center(width)

返回一個原字符串居中,並使用空格填充至長度 width 的新字符串

string.count(str, beg=0, end=len(string))

返回 str 在 string 里面出現的次數,如果 beg 或者 end 指定則返回指定范圍內 str 出現的次數

string.decode(encoding='UTF-8', errors='strict')

以 encoding 指定的編碼格式解碼 string,如果出錯默認報一個 ValueError 的 異 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace'

string.encode(encoding='UTF-8', errors='strict')

以 encoding 指定的編碼格式編碼 string,如果出錯默認報一個ValueError 的異常,除非 errors 指定的是'ignore'或者'replace'

string.endswith(obj, beg=0, end=len(string))

檢查字符串是否以 obj 結束,如果beg 或者 end 指定則檢查指定的范圍內是否以 obj 結束,如果是,返回 True,否則返回 False.

string.expandtabs(tabsize=8)

把字符串 string 中的 tab 符號轉為空格,tab 符號默認的空格數是 8。

string.find(str, beg=0, end=len(string))

檢測 str 是否包含在 string 中,如果 beg 和 end 指定范圍,則檢查是否包含在指定范圍內,如果是返回開始的索引值,否則返回-1

string.index(str, beg=0, end=len(string))

跟find()方法一樣,只不過如果str不在 string中會報一個異常.

string.isalnum()

如果 string 至少有一個字符並且所有字符都是字母或數字則返

回 True,否則返回 False

string.isalpha()

如果 string 至少有一個字符並且所有字符都是字母則返回 True,

否則返回 False

string.isdecimal()

如果 string 只包含十進制數字則返回 True 否則返回 False.

string.isdigit()

如果 string 只包含數字則返回 True 否則返回 False.

string.islower()

如果 string 中包含至少一個區分大小寫的字符,並且所有這些(區分大小寫的)字符都是小寫,則返回 True,否則返回 False

string.isnumeric()

如果 string 中只包含數字字符,則返回 True,否則返回 False

string.isspace()

如果 string 中只包含空格,則返回 True,否則返回 False.

string.istitle()

如果 string 是標題化的(見 title())則返回 True,否則返回 False

string.isupper()

如果 string 中包含至少一個區分大小寫的字符,並且所有這些(區分大小寫的)字符都是大寫,則返回 True,否則返回 False

string.join(seq)

以 string 作為分隔符,將 seq 中所有的元素(的字符串表示)合並為一個新的字符串

string.ljust(width)

返回一個原字符串左對齊,並使用空格填充至長度 width 的新字符串

string.lower()

轉換 string 中所有大寫字符為小寫.

string.lstrip()

截掉 string 左邊的空格

string.maketrans(intab, outtab])

maketrans() 方法用於創建字符映射的轉換表,對於接受兩個參數的最簡單的調用方式,第一個參數是字符串,表示需要轉換的字符,第二個參數也是字符串表示轉換的目標。

max(str)

返回字符串 str 中最大的字母。

min(str)

返回字符串 str 中最小的字母。

string.partition(str)

有點像 find()和 split()的結合體,從 str 出現的第一個位置起,把 字 符 串 string 分 成 一 個 3 元 素 的 元 組 (string_pre_str,str,string_post_str),如果 string 中不包含str 則 string_pre_str == string.

string.replace(str1, str2,  num=string.count(str1))

把 string 中的 str1 替換成 str2,如果 num 指定,則替換不超過 num 次.

string.rfind(str, beg=0,end=len(string) )

類似於 find()函數,不過是從右邊開始查找.

string.rindex( str, beg=0,end=len(string))

類似於 index(),不過是從右邊開始.

string.rjust(width)

返回一個原字符串右對齊,並使用空格填充至長度 width 的新字符串

string.rpartition(str)

類似於 partition()函數,不過是從右邊開始查找.

string.rstrip()

刪除 string 字符串末尾的空格.

string.split(str="", num=string.count(str))

以 str 為分隔符切片 string,如果 num有指定值,則僅分隔 num 個子字符串

string.splitlines(num=string.count('\n'))

按照行分隔,返回一個包含各行作為元素的列表,如果 num 指定則僅切片 num 個行.

string.startswith(obj, beg=0,end=len(string))

檢查字符串是否是以 obj 開頭,是則返回 True,否則返回 False。如果beg 和 end 指定值,則在指定范圍內檢查.

string.strip([obj])

在 string 上執行 lstrip()和 rstrip()

string.swapcase()

翻轉 string 中的大小寫

string.title()

返回"標題化"的 string,就是說所有單詞都是以大寫開始,其余字母均為小寫(見 istitle())

string.translate(str, del="")

根據 str 給出的表(包含 256 個字符)轉換 string 的字符,

要過濾掉的字符放到 del 參數中

string.upper()

轉換 string 中的小寫字母為大寫

string.zfill(width)

返回長度為 width 的字符串,原字符串 string 右對齊,前面填充0

string.isdecimal()

isdecimal()方法檢查字符串是否只包含十進制字符。這種方法只存在於unicode對象。

  此表格參考了https://www.cnblogs.com/A-FM/p/5691468.html,主要因為它的方法點進去,有詳細解釋,借鑒過來,主要方便大家。

 

  總結上面的用法,對其分個類,我們可以把字符串操作分為字符串的替換、刪除、截取、復制、連接、比較、查找、分割等

   但是,首先得判斷這個對象是不是字符串,方法如下:

如何判斷一個對象是不是字符串

    python中字符串有兩重,一種是str,一種是unicode。那如何判斷一個對象是不是字符串呢?應該使用isinstance(s,basestring),而不是isinstance(s,str)。看下面例子

>>>a = 'hi'
>>>isinstance(a,str)
True
>>>b = u'Hi'
>>>isinstance(b,str)
False
>>>isinstance(b,basestring)
True
>>>isinstance(b,unicode)
True
>>>isinstance(a,unicode)
False

  要正確判讀一個對象是不是字符串,要有basestring,因為basestring是str和unicode的基類,包含了普通字符串和unicode類型。

如何去掉字符串的雙引號

a = '"string"'
print(a,type(a))
b = eval(a)
print(b,type(b))

結果:
"string" <class 'str'>
string <class 'str'>

  

 

   下面講str對象的基本用法

字符串的基本用法可以分以下五類,即性質判定、查找替換、分切與連接、變形、填空與刪減。

(a)性質判定

性質判定有以下幾個方法。

    isalnum():是否全是字母和數字,並至少有一個字符
    isalpha():是否全是字母,並至少有一個字符 
    isdigit():是否全是數字,並至少有一個字符
    islower():字符串中字母是否全是小寫
    isupper():字符串中字母是否全是小寫
    isspace():是否全是空白字符,並至少有一個字符
    istitle():判斷字符串是否每個單詞都有且只有第一個字母是大寫
    startswith(prefix[,start[,end]]):用於檢查字符串是否是以指定子字符串開頭,如果是則返回 True,否則返 回 False。如果參數 start 和 end 指定值,則在指定范圍內檢查。
    endswith(suffix[,start[,end]]):用於判斷字符串是否以指定后綴結尾,如果以指定后綴結尾返回True,否則返回False。可選參數"start"與"end"為檢索字符串的開始與結束位置。

    is*()這些都比較簡單,從字母的字面上就可以理解,*with()函數可以接受start和end參數,如果善加利用可以優化性能。另外,從python 2.5版本起,*with()函數族的第一個參數可接受tuple類型實參,當實參中某個元素匹配時,即返回True

(b)查找與替換

    count(sub[,start[,end]]):統計字符串里某個字符sub出現的次數。可選參數為在字符串搜索的開始與結束位置。這個數值在調用replace方法時用得着。
    find(sub[,start[,end]]):檢測字符串中是否包含子字符串sub,如果指定start(開始) 和 end(結束) 范圍,則檢查是否包含在指定范圍內,如果包含子字符串返回開始的索引值,否則返回-1
    index(sub[,start[,end]]):跟find()方法一樣,只不過如果sub不在 string中會拋出ValueError異常。
    rfind(sub[,start[,end]]):類似於 find()函數,不過是從右邊開始查找。
    rindex(sub[,start[,end]]):類似於 index(),不過是從右邊開始。
    replace(old,new[,count]):用來替換字符串的某些子串,用new替換old。如果指定count參數話,就最多替換count次,如果不指定,就全部替換

     前面五個方法都可以接受start、end參數,善加利用可以優化性能。對於查找某個字符串中是否有子串,不推薦使用index族和find族方法,推薦使用in和not in操作

(c)分切與連接

    partition(sep):用來根據指定的分隔符將字符串進行分割,如果字符串包含指定的分隔符,則返回一個3元的元組,第一個為分隔符左邊的子串,第二個為分隔符本身,第三個為分隔符右邊的子串。如果sep沒有出現在字符串中,則返回值為(sep,",")。partition() 方法是在2.5版中新增的。
    rpartition(sep):類似於 partition()函數,不過是從右邊開始查找.
    splitness([keepends]):按照行('\r', '\r\n', \n')分隔,返回一個包含各行作為元素的列表,如果參數        keepends 為 False,不包含換行符,如果為 True,則保留換行符。
    split(sep[,maxsplit]]):通過指定分隔符對字符串進行切片,如果參數maxsplit 有指定值,則僅分隔 maxsplit 個子字符串,返回分割后的字符串列表。
    rsplit(sep[,maxsplit]]):同split(),不過是從右邊開始。

  

看下面例子

str1 = 'ab c\n\nde fg\rkl\r\n'
print str1.splitlines();
 
str2 = 'ab c\n\nde fg\rkl\r\n'
print str2.splitlines(True)

  輸出如下:

['ab c', '', 'de fg', 'kl']
['ab c\n', '\n', 'de fg\r', 'kl\r\n']

split()函數有個小陷阱,比如對於字符串s,s.split()和s.split(" ")的返回值不同。看下面代碼

s = "  hello world"#前面有兩個空格
print s.split()
print s.split(' ')

  

輸出結果如下

['hello', 'world']
['', '', 'hello', 'world']

  這是為什么呢?原因在於:當忽略sep參數或者sep參數為None時與明確給sep賦予字符串值時,split()采用了兩種不同的算法。對於前者,split()先除去兩端的空白符,然后以任意長度的空白符串作為界定符分切字符串(即連續空白符串會被單一空白符看待);對於后者則認為兩個兩個連續空白符之間存在一個空字符串,因此對空字符串,它們的返回值也不同。

>>>".split()
[]
>>>''.split(' ')
['']

 

(d)變形

    lower():轉換字符串中所有大寫字符為小寫。
    upper():將字符串中的小寫字母轉為大寫字母。
    capitalize():將字符串的第一個字母變成大寫,其他字母變小寫。對於 8 位字節編碼需要根據本地環境。
    swapcase():用於對字符串的大小寫字母進行轉換,大寫轉小寫,小寫轉大寫。
    title():返回"標題化"的字符串,就是說所有單詞都是以大寫開始,其余字母均為小寫。

  這些都是大小寫切換,title()並不能除去字符串兩端的空白符也不會把連續空白符替換成一個空格,如果有這樣的需求,可以用string模塊的capwords(s)函數,它能除去兩端空白符,並且能將連續的空白符用一個空格符代替。看下面例子:

#coding=utf-8
import string
s = "   hello   world"
print s.title()
print string.capwords(s)

  

輸出結果如下:

   Hello   World
Hello World

(e)刪減與填充

    strip([chars]):用於移除字符串頭尾指定的字符(默認為空格),如果有多個就會刪除多個。
    ltrip([chars]):用於截掉字符串左邊的空格或指定字符。
    rtrip([chars]):用於截掉字符串右邊的空格或指定字符。
    center(width[,fillchar]):返回一個原字符串居中,並使用fillchar填充至長度 width 的新字符串。默認填充字符為空格
    ljust(width[,fillchar]):返回一個原字符串左對齊,並使用fillchar填充至指定長度的新字符串,默認為空格。如果指定的長度小於原字符串的長度則返回原字符串。
    rjust(width[,fillchar]):返回一個原字符串右對齊,並使用fillchar填充至長度 width 的新字符串。如果指定的長度小於字符串的長度則返回原字符串。
    zfill(width):返回指定長度的字符串,原字符串右對齊,前面填充0
    expandtabs([tabsize]):把字符串中的 tab 符號('\t')轉為適當數量的空格,默認情況下是轉換為8個。

(f)字符串切片

  

切片操作(slice)可以從一個字符串中獲取子字符串(字符串的一部分)。我們使用一對方括號、起始偏移量start、終止偏移量end 以及可選的步長step 來定義一個分片。

格式: [start:end:step]

  • • [:] 提取從開頭(默認位置0)到結尾(默認位置-1)的整個字符串
  • • [start:] 從start 提取到結尾
  • • [:end] 從開頭提取到end - 1
  • • [start:end] 從start 提取到end - 1
  • • [start:end:step] 從start 提取到end - 1,每step 個字符提取一個
  • • 左側第一個字符的位置/偏移量為0,右側最后一個字符的位置/偏移量為-1
str = '0123456789′
print str[0:3] #截取第一位到第三位的字符
print str[:] #截取字符串的全部字符
print str[6:] #截取第七個字符到結尾
print str[:-3] #截取從頭開始到倒數第三個字符之前
print str[2] #截取第三個字符
print str[-1] #截取倒數第一個字符
print str[::-1] #創造一個與原字符串順序相反的字符串
print str[-3:-1] #截取倒數第三位與倒數第一位之前的字符
print str[-3:] #截取倒數第三位到結尾
print str[:-5:-3] #逆序截取,截取倒數第五位數與倒數第三位數之間
print str[::2] #按照步長為二,返回所有值

(g) maketrans和translate的用法

開發敏感詞語過濾程序,提示用戶輸入內容,如果用戶輸入的內容中包含特殊的字符:
如:"蒼老師"“東京熱”,則將內容替換為***

sentence_input  = input("請輸入:")
sensitive_varcabulary1 = str.maketrans("蒼老師",'***')
sensitive_varcabulary2 = str.maketrans("東京熱",'***')
new_sentence = sentence_input.translate(sensitive_varcabulary1).translate(sensitive_varcabulary2)
print(new_sentence)
# 請輸入:dads大大的蒼老師
# dads大大的***

(h)字符串格式化(format)

     用法:它通過 {} 和 :  代替傳統的 % 方法

  1,使用關鍵字參數

  要點:關鍵字參數值要對得上,可用字典當關鍵字參數傳入值,字典前加**即可

>>> hash = {'name':'hoho','age':18}
>>> 'my name is {name},age is {age}'.format(name='hoho',age=19)
'my name is hoho,age is 19'
>>> 'my name is {name},age is {age}'.format(**hash)
'my name is hoho,age is 18'

  2,填充與格式化

  :[填充字符][對齊方式 <^>][寬度]

'{:<20}'.format(10)           #左對齊
'10                  '
'{:>20}'.format(10)           #右對齊
'                  10' 
'{:^20}'.format(10)           #居中對齊
'         10         '
    

  3,使用位置參數

  要點:從以下例子可以看出位置參數不受順序約束,且可以為{},只要format里有相對應的參數值即可,參數索引從0開,傳入位置參數列表可用*列表

>>> li = ['hoho',18]
>>> 'my name is {} ,age {}'.format('hoho',18)
'my name is hoho ,age 18'
>>> 'my name is {1} ,age {0}'.format(10,'hoho')
'my name is hoho ,age 10'
>>> 'my name is {1} ,age {0} {1}'.format(10,'hoho')
'my name is hoho ,age 10 hoho'
>>> 'my name is {} ,age {}'.format(*li)
'my name is hoho ,age 18'

  4,精度與進制

>>> '{0:.2f}'.format(1/3)
'0.33'
>>> '{0:b}'.format(10)    #二進制
'1010'
>>> '{0:o}'.format(10)     #八進制
'12'
>>> '{0:x}'.format(10)     #16進制
'a'
>>> '{:,}'.format(12369132698)  #千分位格式化
'12,369,132,698'

  5,使用索引

>>> li
['hoho', 18]
>>> 'name is {0[0]} age is {0[1]}'.format(li)
'name is hoho age is 18

  

(i)常用字符串技巧

1,反轉字符串

>>> s = '1234567890'
>>> print s[::-1]
0987654321

2,關於字符串的拼接

盡量使用join()鏈接字符串,因為’+’號連接n個字符串需要申請n-1次內存,使用join()需要申請1次內存。

3,固定長度分割字符串

>>> import re
>>> s = '1234567890'
>>> re.findall(r'.{1,3}', s)  # 已三個長度分割字符串
['123', '456', '789', '0']

4,使用()括號生成字符串

sql = ('SELECT count() FROM table '
       'WHERE id = "10" '
       'GROUP BY sex')
 
print sql
 
SELECT count() FROM table WHERE id = "10" GROUP BY sex

5,將print的字符串寫到文件

>>> print >> open("somefile.txt", "w+"), "Hello World"  
# Hello World將寫入文件somefile.txt

  

string模塊

ascii_letters
獲取所有ascii碼中字母字符的字符串(包含大寫和小寫)

ascii_uppercase
獲取所有ascii碼中的大寫英文字母

ascii_lowercase
獲取所有ascii碼中的小寫英文字母

digits
獲取所有的10進制數字字符

octdigits
獲取所有的8進制數字字符

hexdigits
獲取所有16進制的數字字符

printable
獲取所有可以打印的字符

whitespace
獲取所有空白字符

punctuation
獲取所有的標點符號

  

 python 如何從指定文件夾中讀取csv文件格式

  遍歷文件夾,找到csv格式的文件

    import os
    Path_list = os.listdir(PathName0)
    for name in Path_list:
        if name.endswith('.csv'):
            print(name)

  

 

集合操作方法詳解,請看下面博客:http://www.cnblogs.com/wj-1314/p/8423273.html

字典操作方法詳解,請看下面博客:http://www.cnblogs.com/wj-1314/p/8421724.html

列表操作方法詳解,請看下面博客:http://www.cnblogs.com/wj-1314/p/8433116.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM