給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(' ')
['']
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
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] #按照步長為二,返回所有值
開發敏感詞語過濾程序,提示用戶輸入內容,如果用戶輸入的內容中包含特殊的字符:
如:"蒼老師"「東京熱」,則將內容替換為***
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大大的***
用法:它通過 {} 和 : 代替傳統的 % 方法
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
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
ascii_letters
獲取所有ascii碼中字母字符的字符串(包含大寫和小寫)
ascii_uppercase
獲取所有ascii碼中的大寫英文字母
ascii_lowercase
獲取所有ascii碼中的小寫英文字母
digits
獲取所有的10進位數字字符
octdigits
獲取所有的8進位數字字符
hexdigits
獲取所有16進位的數字字符
printable
獲取所有可以列印的字符
whitespace
獲取所有空白字符
punctuation
獲取所有的標點符號
遍歷文件夾,找到csv格式的文件
import os
Path_list = os.listdir(PathName0)
for name in Path_list:
if name.endswith('.csv'):
print(name)