python 通關字符串操作方法詳解-大量案例

2021-02-19 IT入門

給IT入門加星標,提升編程技能

IT入門(ID:learncode)整理 

原作者:戰爭熱誠

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

Python實際三類字符串:

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

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

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

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

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


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

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

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

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]):用於移除字符串頭尾指定的字符(默認為空格),如果有多個就會刪除多個。

lstrip([chars]):用於截掉字符串左邊的空格或指定字符。

rstrip([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] #逆序截取,截取倒數第五位數與倒數第三位數之間<br>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模塊image

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)

相關焦點

  • 13-python爬蟲之JSON操作
    Json模塊提供了四個功能:dumps、dump、loads、load,用於字符串 和 python數據類型間進行轉換https://docs.python.org/zh-cn/3/library/json.htmlhttp://tool.oschina.net/codeformat/json1. json.loads()實現:json字符串
  • Python中的字符串和字符數據(下)
    字符串格式化本組方法修改或增強字符串的格式。在字符串和列表之間轉換此組中的方法通過將對象粘貼在一起以生成字符串或將字符串分成多個片段來在字符串和某些複合數據類型之間進行轉換。這些方法操作或返回iterables,這是對象的順序集合的通用Python術語。您將在即將到來的definite iteration教程中更詳細地探索iterables的內部工作原理。這些方法中很多都返回列表或者是元組。這是兩個類似的複合數據類型,它們是Python中可迭代對象的典型示例。它們將在下一個教程中介紹,所以很快您將了解它們。
  • 站長在線零基礎Python完全自學教程20:在Python中使用正則表達式完全解讀
    如果直接使用點字符,格式為:[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}這顯然不對,因為「.」可以匹配一個任意字符。這時,不僅是127.0.0.1這樣的IP,連127101011這樣的字串也會被匹配出來。所以在使用「.」時,需要使用轉義字符(\)。
  • JS中字符串操作,史上最全匯總!
    s1.color='red'•        s2.color='green'•        console.log(s1.color)//執行這行時,創建的String實例,已經被銷毀了undefined•        console.log(s2.color) //green•        //疑問:s1為什麼可以調用類似substring這樣的方法
  • Java字符串String那些事
    String# intern❝String::intern()是一個本地方法,它的作用是如果字符串常量池中已經包含一個等於此String對象的字符串,則返回代表池中這個字符串的String對象的引用;否則,會將此String對象包含的字符串添加到常量池中,並且返回此String對象的引用。
  • Golang 語言怎麼高效使用字符串?
    如果需要修改,通常的做法是對原字符串進行截取和拼接操作,從而生成一個新字符串,但是會涉及內存分配和數據拷貝,從而有性能開銷。本文我們介紹在 Golang 語言中怎麼高效使用字符串。我們已經知道字符串在 runtime 中的結構體包含兩個欄位,指向存儲數據的內存地址的指針和字符串的長度,因為字符串是只讀的,字符串被賦值後,它的數據和長度都不會被修改,所以讀取字符串的長度,實際上就是讀取欄位 len 的值,複雜度是 O(1)。
  • 一文看懂Python列表表達式及高階函數如lamda, zip, enumerate, map和filter方法.
    <lambda> at 0x03ADE2B8>>>> flist[0](2)4zip函數zip()函數來可以把2個或多個列表合併,並創建一個元組對的列表。元組對的數量以合併列表的最短長度為準。
  • Python編程入門——基礎語法詳解(經典)
    今天小編給大家帶來Python編程入門——基礎語法詳解。溫馨提示:亮點在最後!
  • python 進階知識點總結
    公用方法:  + 用於字符串,元組,列表的拼接- 用於集合求差集* 用於字符串,元組,列表重複多次列印in 成員運算符(判斷內容是否存在)'a' in ['a','n','c']'a' in 'agasaa''a' in ('a','b','aa')用於字典是判斷key是否存在
  • Redis-簡單動態字符串(SDS)
    眾所周知,Redis使用C語言編寫的,至於Redis為何不用C語言中的字符串表示,且聽我娓娓道來。由於SDS同C字符串一樣遵循空字符結尾,所以可以直接對SDS使用C語言的函數進行操作。3.與C字符串的區別  下面我們將對比SDS與C字符串的區別,解釋Redis選擇SDS而非C字符串的原因。
  • 連載|想用Python做自動化測試?Python反射機制的應用
    @staticmethod def feed(): print("Three times per day.") @classmethod def sleep(cls): print("8 hours!")
  • Python爬蟲從入門到精通(2): requests庫詳解,cookie操作與實戰
    Python的第三方requests庫是基於urllib編寫的,但是比urllib庫強大,非常適合爬蟲的編寫,可以幫我們節省很多工作。
  • 第28天:Python sys 模塊詳解
    2.6 sys.builtin_module_names該屬性是一個字符串元組,其中的元素均為當前所使用的的 Python 解釋器內置的模塊名稱。注意區別sys.modules和sys.builtin_module_names——前者的關鍵字(keys)列出的是導入的模塊名,而後者則是解釋器內置的模塊名。
  • 用python和Tesseract實現光學字符識別(OCR)
    本教程結束之後,您將能夠將圖像中的文本轉換為Python字符串數據類型。使用Tesseract-OCR和python本文分成以下三個部分:    1、學習安裝pythesseract軟體包,以便我們可以通過Python程式語言訪問Tesseract。
  • 妙用正則表達式--Python中的re模塊
    課程通過案例教學模式,旨在幫助大家在短期內掌握Stata軟體編程、金融計量知識和實證分析方法,使大家熟悉Stata核心的爬蟲技術,以及Stata與其他軟體交互的高端技術。目前正在火熱招生中~詳細培訓大綱及報名方式,請點擊文末閱讀原文呦~另外,2019年11月29日-12月1日,武漢字符串數據科技有限公司將在湖北武漢舉辦《第四期Python編程技術培訓》的招生即將結束,還有少量名額,感興趣的同學可打開爬蟲俱樂部往期推文——《2019年Python第四期培訓招生
  • python基礎
    strpython中,序列就是一組按照順序排列的值【數據集合】在python中存在三種內置序列類型:字符串、列表、元組優點:可以支持索引和切片的操作切片語法:[start:end:step]字符串常用方法
  • 完整的 string.Format對C#字符串格式化
    零佔位符:如果格式化的值在格式字符串中出現「0」的位置有一個數字,則此數字被複製到結果字符串中。小數點前最左邊的「0」的位置和小數點後最右邊的「0」的位置確定總在結果字符串中出現的數字範圍。「00」說明符使得值被捨入到小數點前最近的數字,其中零位總被捨去。數字佔位符:如果格式化的值在格式字符串中出現「#」的位置有一個數字,則此數字被複製到結果字符串中。
  • Python也能操作MongoDB資料庫!
    Robo 3T 1.3為您提供了對MongoDB 4.0和SCRAM-SHA-256(升級的mongo shell)的支持支持從MongoDB SRV連接字符串導入,以及許多其他修復和改進。大家也可以找到之前的Robomongo,完全免費的版本使用。
  • Python學習之如何使用Python解釋器
    在 Python 主窗口中輸入 Control-P 可能是檢查是否支持命令行編輯的最簡單的方法。如果發出嘟嘟聲(計算機揚聲器),則說明你可以使用命令行編輯功能; 如果沒有任何聲音,或者顯示 ^P 字符,則說明命令行編輯功能不可用;你只能通過退格鍵從當前行刪除已鍵入的字符並重新輸入。
  • 5分鐘速覽python正則表達式常用函數
    本文不過多展開正則表達式相關語法,僅簡要介紹python中正則表達式常用函數及其使用方法,以作快速查詢瀏覽。Re模塊是python的內置模塊,提供了正則表達式在python中的所有用法,默認安裝位置在python根目錄下的Lib文件夾(如 ..\Python\Python37\Lib)。