機器學習-文本處理
Pandas 處理文本字元串
官網學習連結:https://www.pypandas.cn/docs/user_guide/text.html#%E6%8B%86%E5%88%86%E5%92%8C%E6%9B%BF%E6%8D%A2%E5%AD%97%E7%AC%A6%E4%B8%B2
大小寫轉換、計算字元串長度
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s.str.lower() #将字元串轉換為小寫,自動跳過NAN
s.str.upper() #将字元串轉換為大寫
s.str.len() #每個字元串的長度,如‘A’的長度為1.0
删除字元串中的空格
idx = pd.Index([' jack', 'jill ', ' jesse ', 'frank'])
idx.str.strip() #删除字元串中的空格
idx.str.lstrip() #截掉字元串左邊的空格或指定字元
idx.str.rstrip() #截掉字元串右邊的空格或指定字元
拆分字元串
s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])
s2.str.split('_') #将字元串根據‘-’拆分
s2.str.split('_', expand=True) #使用expand方法可以輕易地将這種傳回展開為一個資料表
s2.str.split('_', expand=True, n=1) #限制切分的次數(從0開始數)
s2.str.split('_').str.get(1) #切分後的清單中的元素可以通過 get 方法或者 [] 方法進行讀取
s2.str.split('_').str[1]
s2.str.rsplit('_', expand=True, n=1) #rsplit與split相似,不同的是,這個切分的方向是反的。即,從字串的尾端向首段切分
替換字元串
s3 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca',
'', np.nan, 'CABA', 'dog', 'cat'])
s3.str.replace('^.a|dog', 'XX-XX ', case=False) #把所有以a結尾的或者是dog的字元串替換成XX-XX。replace方法預設使用正規表達式
dollars.str.replace('-$', '-', regex=False) #replace替換包含'$'符号時這樣寫
pat = r'[a-z]+'
def repl(m):
return m.group(0)[::-1]
pd.Series(['foo 123', 'bar baz', np.nan]).str.replace(pat, repl) #replace的友善用法
拼接字元串
s = pd.Series(['a', 'b', 'c', 'd'])
s.str.cat(sep=',') #将單個序列拼接為一個完整字元串,sep 即分隔符預設為空字串,即sep=''
t.str.cat(sep=',', na_rep='-') #預設情況下,缺失值會被忽略。使用na_rep參數,可以對缺失值進行指派
s.str.cat(['A', 'B', 'C', 'D']) #拼接序列和其他類清單型對象為新的序列,cat() 的第一個參數為類清單對象,但必須要確定長度與序列或索引相同
s.str.cat(t, na_rep='-') #任何一端的缺失值都會導緻之中結果為缺失值,除非使用na_rep
s.str.cat(u, join='left') #對齊操作。join的選項為('left', 'outer', 'inner', 'right')中的一個。特别的,對齊操作使得兩個對象可以是不同的長度。隻要禁用對齊join=None,那麼序列或索引就可以是任意長度
d = pd.concat([t, s], axis=1)
字元串索引
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan,
'CABA', 'dog', 'cat'])
s.str[0] #傳回每個字元串的第一個元素,如果你的索引超過了字元串的結尾,将傳回NaN
提取子字元串
pd.Series(['a1', 'b2', 'c3']).str.extract(r'([ab])(\d)', expand=False)#提取第一個比對的對象。沒有成功比對的元素将會傳回一行NaN
#extract擁有了expand 參數。當 expand=False時, 将傳回一個序列,索引或者資料表, 這取決于原對象和正規表達式(之前的版本也是如此)。當 expand=True時,它則總是傳回一個DataFrame
------------------------------------------------------------------------------
s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"])
two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'
s.str.extract(two_groups, expand=True) #提取所有的比對
測試比對或包含模式的字元串
pattern = r'[0-9][a-z]'
pd.Series(['1', '2', '3a', '3b', '03c']).str.contains(pattern) #你可以檢查是否一個元素包含一個可以比對到的正規表達式
s4.str.contains('A', na=False) #是否元素完整比對一個正規表達式,傳回True或False
pd.Series(['1', '2', '3a', '3b', '03c']).str.match(pattern) #是否元素完整比對一個正規表達式,傳回True或False
建立一個訓示變量
s = pd.Series(['a', 'a|b', np.nan, 'a|c'])
s.str.get_dummies(sep='|') #你從字元串列可以抽出一個啞變量。例如,是否他們由|分割
方法總覽
方法 | 描述 |
---|---|
cat() | 拼接字元串 |
split() | 基于分隔符切分字元串 |
rsplit() | 基于分隔符,逆向切分字元串 |
get() | 索引每一個元素(傳回第i個元素) |
join() | 使用傳入的分隔符依次拼接每一個元素 |
get_dummies() | 用分隔符切分字元串,并傳回一個含有啞變量的資料表 |
contains() | 傳回一個布爾矩陣表明是每個元素包含字元串或正規表達式 |
replace() | 将比對到的子串或正規表達式替換為另外的字元串,或者一個可調用對象的傳回值 |
repeat() | 值複制(s.str.repeat(3)等價于x * 3) |
pad() | 将白空格插入到字元串的左、右或者兩端 |
center() | 等價于 |
ljust() | 等價于 |
rjust() | 等價于 |
zfill() | 等價于 |
wrap() | 将長字元串轉換為不長于給定長度的行 |
slice() | 将序列中的每一個字元串切片 |
slice_replace() | 用傳入的值替換每一個字串中的切片 |
count() | 對出現符合的規則進行計數 |
startswith() | 等價于 |
endswith() | 等價于 |
findall() | 傳回每一個字串中出現的所有滿足樣式或正則的比對 |
match() | 素調用 ,并以清單形式傳回比對到的組 |
extract() | Call 對每一個元素調用 , 并以資料表的形式傳回。行對應原有的一個元素,列對應所有捕獲的組 |
extractall() | 一個元素調用 , 并以資料表的形式傳回。行對應原有的一個元素,列對應所有捕獲的組 |
len() | 計算字元串長度 |
strip() | 等價于 |
rstrip() | 等價于 |
lstrip() | 等價于 |
partition() | 等價于 |
rpartition() | 等價于 |
lower() | 等價于 |
casefold() | 等價于 |
upper() | 等價于 |
find() | 等價于 |
rfind() | 等價于 |
index() | 等價于 |
rindex() | 等價于 |
capitalize() | 等價于 |
swapcase() | 等價于 |
normalize() | 傳回Unicode 标注格式。等價于 unicodedata.normalize |
translate() | 等價于 |
isalnum() | 等價于 |
isalpha() | 等價于 |
isdigit() | 等價于 |
isspace() | 等價于 |
islower() | 等價于 |
isupper() | 等價于 |
istitle() | 等價于 |
isnumeric() | 等價于 |
isdecimal() | 等價于 |
正規表達式
re子產品常用的函數
函數 | 描述 |
---|---|
match(pattern,string,flags=0) | 根據pattern從string的頭部開始比對字元串,隻傳回第一次比對成功的對象;否則,傳回None |
findall(pattern,string,flags=0) | 根據pattern在string中比對字元串。如果比對成功,傳回比對結果的清單;否則,傳回空清單。當pattern中有分組時,傳回包含多個元組的清單,每個元組對應1個分組。flags表示規則選項,規則選項用于輔助比對。 |
sub(pattern,repl,string,count=0) | 根據指定的正規表達式,替換源字元串中的子串。pattern是一個正規表達式,repl是用于替換的字元串,string是源字元串。如果count等于0,則傳回string中比對的所有結果;如果count大于0,則傳回count個比對的結果。 |
subn(pattern,repl,string,count=0) | 作用和sub()相同,傳回一個二進制的元組。第一個元素是替換結果,第二個元素是替換的次數。 |
search(pattern,string,flags=0) | 根據pattern在string中比對字元串,隻傳回第一次比對成功的對象。如果比對失敗,傳回None |
compile(pattern,flags=0) | 編譯正規表達式pattern,傳回1個pattern的對象 |
split(pattern,string,maxsplit=0) | 根據pattern分割string,maxsplit表示最大的分割數 |
escape(pattern) | 比對字元串中的特殊字元,如*、+、?等 |
match方法
re.match嘗試從字元串的起始位置比對一個模式,如果不是起始位置比對成功的話,match()就傳回None。文法格式如下:
函數參數說明如下:
match函數參數說明
參數 | 描述 |
---|---|
pattern | 比對的正規表達式 |
string | 要比對的字元串 |
flags | 标志位,用于空值正規表達式的比對方式,如:是否區分大小寫,多行比對等等。如下表列出正規表達式修飾符-可選标志 |
正規表達式修飾符-可選标志
修飾符 | 描述 |
---|---|
re.I | 使比對對大小寫不敏感 |
re.L | 做本地識别(locale-aware)比對 |
re.M | 多行比對,影響^和$ |
re.S | 使.比對包括換行在内的所有字元 |
re.U | 根據Unicode字元集解析字元,這個标志影響\w,\W,\b,\B |
該标志通過給予你更靈活的格式以便你将正規表達式寫的更易于了解 |
比對字元串是正規表達式中最常用的一類應用。也就是設定一個文本模式,然後判斷另外一個字元串是否符合這個文本模式。
如果文本模式隻是一個普通的字元串,那麼待比對的字元串和文本模式字元串在完全相等的情況下, match方法會認為比對成功。如果比對成功,則match方法傳回比對的對象,然後可以調用對象中的group方法擷取比對成功的字元串,如果文本模式就是一個普通的字元串,那麼group方法傳回的就是文本模式字元串本身。
執行個體
import re
s='hello python'
pattern='hello'
o=re.match(pattern,s,re.I) #re.I不區分大小寫
print(o)
print(dir(o))
print(o.group) #傳回比對的字元串
常用比對符
正規表達式中常用的字元
符号 | 描述 |
---|---|
. | 比對任意一個字元(除了\n) |
[] | 比對清單中的字元 |
\w | 比對字母、數字、下劃線,即a-z,A-Z,0-9,_ |
\W | 比對不是字母、數字、下劃線 |
\s | 比對空白字元,即空格(\n,\t) |
\S | 比對不是空白的字元 |
\d | 比對數字,即0-9 |
\D | 比對非數字的字元 |
執行個體
import re
print('------.的使用------')
s='a'
s='A'
s='8'
s='_'
pattern='.'
o=re.match(pattern,s)
print(o)
print('------\d的使用------') #數字
print('------\s的使用------')
表示數量(比對多個字元)
執行個體
import re
pattern='\d\d\d\d\d\d\d\d\d' #比對手機号
pattern='1[135789]\d\d\d\d\d\d\d'
s='13456788765'
o=re.match(pattern,s)
print(o)
#電話号碼 區号-座機号 010-3762266 0342-8776262
正規表達式中常用的限定符
符号 | 描述 | 符号 | 描述 |
---|---|---|---|
* | 比對零次或多次 | {m} | 重複m次 |
+ | 比對一次或多次 | {m,n} | 重複m到n次,其中n可以省略,表示m到任意次 |
? | 比對一次或零次 | {m,} | 至少m次 |
利用{}可以空值符号重複的次數
執行個體
import re
print('------*的使用------')
s='123qwe'
pattern='\d*'
o=re.match(pattern,s)
print(o)
print('------+的使用------')
print('------?的使用------')