序列和索引包含一些列的字符操作方法,這可以使我們輕易操作數(shù)組中的各個元素。最重要的是,這些方法可以自動跳過 缺失/NA 值。這些方法可以在str
屬性中訪問到,并且基本上和python內建的(標量)字符串方法同名:
In [1]: s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
In [2]: s.str.lower()
Out[2]:
0 a
1 b
2 c
3 aaba
4 baca
5 NaN
6 caba
7 dog
8 cat
dtype: object
In [3]: s.str.upper()
Out[3]:
0 A
1 B
2 C
3 AABA
4 BACA
5 NaN
6 CABA
7 DOG
8 CAT
dtype: object
In [4]: s.str.len()
Out[4]:
0 1.0
1 1.0
2 1.0
3 4.0
4 4.0
5 NaN
6 4.0
7 3.0
8 3.0
dtype: float64
In [5]: idx = pd.Index([' jack', 'jill ', ' jesse ', 'frank'])
In [6]: idx.str.strip()
Out[6]: Index(['jack', 'jill', 'jesse', 'frank'], dtype='object')
In [7]: idx.str.lstrip()
Out[7]: Index(['jack', 'jill ', 'jesse ', 'frank'], dtype='object')
In [8]: idx.str.rstrip()
Out[8]: Index([' jack', 'jill', ' jesse', 'frank'], dtype='object')
索引的字符串方法在清理或者轉換數(shù)據(jù)表列的時候非常有用。例如,你的列中或許會包含首位的白空格:
In [9]: df = pd.DataFrame(np.random.randn(3, 2),
...: columns=[' Column A ', ' Column B '], index=range(3))
...:
In [10]: df
Out[10]:
Column A Column B
0 0.469112 -0.282863
1 -1.509059 -1.135632
2 1.212112 -0.173215
Since df.columns
is an Index object, we can use the .str
accessor
In [11]: df.columns.str.strip()
Out[11]: Index(['Column A', 'Column B'], dtype='object')
In [12]: df.columns.str.lower()
Out[12]: Index([' column a ', ' column b '], dtype='object')
這些字符串方法可以被用來清理需要的列。這里,我們想清理開頭和結尾的白空格,將所有的名稱都換為小寫,并且將其余的空格都替換為下劃線:
In [13]: df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_')
In [14]: df
Out[14]:
column_a column_b
0 0.469112 -0.282863
1 -1.509059 -1.135632
2 1.212112 -0.173215
小貼士
如果你有一個序列,里面有很多重復的值 (即,序列中唯一元素的數(shù)量遠小于序列
的長度),將原有序列轉換為一種分類類型,然后使用.str.
或者 .dt.
方法,則會獲得更快的速度。 速度的差異來源于,在分類類型
的序列
中,字符操作只是在categories
中完成的,而不是針對序列
中的每一個元素。
請注意,相比于字符串類型的序列
,帶.categories
類型的 分類
類別的 序列
有一些限制(例如,你不能像其中的元素追加其他的字串:s + " " + s
將不能正確工作,如果s是一個分類
類型的序列。并且,.str
中,那些可以對 列表(list)
類型的元素進行操作的方法,在分類序列中也無法使用。
警告
v.0.25.0版以前, .str
訪問器只會進行最基本的類型檢查。 從v.0.25.0起,序列的類型會被自動推斷出來,并且會更為激進地使用恰當?shù)念愋汀?/p>
一般來說 .str
訪問器只傾向于針對字符串類型工作。只有在個別的情況下,才能對非字符串類型工作,但是這也將會在未來的版本中被逐步修正
類似split
的方法返回一個列表類型的序列:
In [15]: s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])
In [16]: s2.str.split('_')
Out[16]:
0 [a, b, c]
1 [c, d, e]
2 NaN
3 [f, g, h]
dtype: object
切分后的列表中的元素可以通過 get
方法或者 []
方法進行讀?。?/p>
In [17]: s2.str.split('_').str.get(1)
Out[17]:
0 b
1 d
2 NaN
3 g
dtype: object
In [18]: s2.str.split('_').str[1]
Out[18]:
0 b
1 d
2 NaN
3 g
dtype: object
使用expand
方法可以輕易地將這種返回展開為一個數(shù)據(jù)表.
In [19]: s2.str.split('_', expand=True)
Out[19]:
0 1 2
0 a b c
1 c d e
2 NaN NaN NaN
3 f g h
同樣,我們也可以限制切分的次數(shù):
In [20]: s2.str.split('_', expand=True, n=1)
Out[20]:
0 1
0 a b_c
1 c d_e
2 NaN NaN
3 f g_h
rsplit
與split
相似,不同的是,這個切分的方向是反的。即,從字串的尾端向首段切分:
In [21]: s2.str.rsplit('_', expand=True, n=1)
Out[21]:
0 1
0 a_b c
1 c_d e
2 NaN NaN
3 f_g h
replace
方法默認使用 正則表達式:
In [22]: s3 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca',
....: '', np.nan, 'CABA', 'dog', 'cat'])
....:
In [23]: s3
Out[23]:
0 A
1 B
2 C
3 Aaba
4 Baca
5
6 NaN
7 CABA
8 dog
9 cat
dtype: object
In [24]: s3.str.replace('^.a|dog', 'XX-XX ', case=False)
Out[24]:
0 A
1 B
2 C
3 XX-XX ba
4 XX-XX ca
5
6 NaN
7 XX-XX BA
8 XX-XX
9 XX-XX t
dtype: object
一定要時時記得,是正則表達式,因此要格外小心。例如,因為正則表達式中的*$*符號,下列代碼將會導致一些麻煩:
# Consider the following badly formatted financial data
In [25]: dollars = pd.Series(['12', '-$10', '$10,000'])
# This does what you'd naively expect:
In [26]: dollars.str.replace('$', '')
Out[26]:
0 12
1 -10
2 10,000
dtype: object
# But this doesn't:
In [27]: dollars.str.replace('-$', '-')
Out[27]:
0 12
1 -$10
2 $10,000
dtype: object
# We need to escape the special character (for >1 len patterns)
In [28]: dollars.str.replace(r'-\$', '-')
Out[28]:
0 12
1 -10
2 $10,000
dtype: object
v0.23.0. 新加入
如果你只是向單純地替換字符 (等價于python中的 str.replace()
),你可以將可選參數(shù) regex
設置為 False
,而不是傻傻地轉義所有符號。這種情況下,pat
和 repl
就都將作為普通字符對待:
# These lines are equivalent
In [29]: dollars.str.replace(r'-\$', '-')
Out[29]:
0 12
1 -10
2 $10,000
dtype: object
In [30]: dollars.str.replace('-$', '-', regex=False)
Out[30]:
0 12
1 -10
2 $10,000
dtype: object
v0.20.0. 新加入
replace
方法也可以傳入一個可調用對象作為替換值。它針對每一個 pat
通過re.sub()
調用??烧{用對象應只具有一個形參(一個正則表達式對象)并且返回一個字符串。
# Reverse every lowercase alphabetic word
In [31]: pat = r'[a-z]+'
In [32]: def repl(m):
....: return m.group(0)[::-1]
....:
In [33]: pd.Series(['foo 123', 'bar baz', np.nan]).str.replace(pat, repl)
Out[33]:
0 oof 123
1 rab zab
2 NaN
dtype: object
# Using regex groups
In [34]: pat = r"(?P<one>\w+) (?P<two>\w+) (?P<three>\w+)"
In [35]: def repl(m):
....: return m.group('two').swapcase()
....:
In [36]: pd.Series(['Foo Bar Baz', np.nan]).str.replace(pat, repl)
Out[36]:
0 bAR
1 NaN
dtype: object
v0.20.0. 新加入
replace
方法也可以接受一個來自re.compile()
編譯過的正則表達式對象,來做為表達式
。所有的標記都應該被包含在這個已經(jīng)編譯好的正則表達式對象中。
In [37]: import re
In [38]: regex_pat = re.compile(r'^.a|dog', flags=re.IGNORECASE)
In [39]: s3.str.replace(regex_pat, 'XX-XX ')
Out[39]:
0 A
1 B
2 C
3 XX-XX ba
4 XX-XX ca
5
6 NaN
7 XX-XX BA
8 XX-XX
9 XX-XX t
dtype: object
如果在已經(jīng)使用編譯的正則對象中繼續(xù)傳入flags
參數(shù),并進行替換,將會導致ValueError
。
In [40]: s3.str.replace(regex_pat, 'XX-XX ', flags=re.IGNORECASE)
---------------------------------------------------------------------------
ValueError: case and flags cannot be set when pat is a compiled regex
Pandas提供了不同的方法將序列
或索引
與他們自己或者其他的對象進行拼接,所有的方法都是基于各自的cat()
resp. Index.str.cat
.
序列
或索引
的內容可以進行拼接:
In [41]: s = pd.Series(['a', 'b', 'c', 'd'])
In [42]: s.str.cat(sep=',')
Out[42]: 'a,b,c,d'
如果沒有額外聲明,sep
即分隔符默認為空字串,即sep=''
:
In [43]: s.str.cat()
Out[43]: 'abcd'
默認情況下,缺失值會被忽略。使用na_rep
參數(shù),可以對缺失值進行賦值:
In [44]: t = pd.Series(['a', 'b', np.nan, 'd'])
In [45]: t.str.cat(sep=',')
Out[45]: 'a,b,d'
In [46]: t.str.cat(sep=',', na_rep='-')
Out[46]: 'a,b,-,d'
cat()
的第一個參數(shù)為類列表對象,但必須要確保長度與序列
或索引
相同.
In [47]: s.str.cat(['A', 'B', 'C', 'D'])
Out[47]:
0 aA
1 bB
2 cC
3 dD
dtype: object
任何一端的缺失值都會導致之中結果為缺失值,除非使用na_rep
:
In [48]: s.str.cat(t)
Out[48]:
0 aa
1 bb
2 NaN
3 dd
dtype: object
In [49]: s.str.cat(t, na_rep='-')
Out[49]:
0 aa
1 bb
2 c-
3 dd
dtype: object
v0.23.0. 新加入
others
參數(shù)可以是二維的。此時,行數(shù)需要與序列
或索引
的長度相同。
In [50]: d = pd.concat([t, s], axis=1)
In [51]: s
Out[51]:
0 a
1 b
2 c
3 d
dtype: object
In [52]: d
Out[52]:
0 1
0 a a
1 b b
2 NaN c
3 d d
In [53]: s.str.cat(d, na_rep='-')
Out[53]:
0 aaa
1 bbb
2 c-c
3 ddd
dtype: object
v0.23.0.新加入
對于拼接序列
或者數(shù)據(jù)表
,我們可以使用 join
關鍵字來對齊索引。
In [54]: u = pd.Series(['b', 'd', 'a', 'c'], index=[1, 3, 0, 2])
In [55]: s
Out[55]:
0 a
1 b
2 c
3 d
dtype: object
In [56]: u
Out[56]:
1 b
3 d
0 a
2 c
dtype: object
In [57]: s.str.cat(u)
Out[57]:
0 ab
1 bd
2 ca
3 dc
dtype: object
In [58]: s.str.cat(u, join='left')
Out[58]:
0 aa
1 bb
2 cc
3 dd
dtype: object
警告
如果不使用join
關鍵字, cat()
方法將會滾回到0.23.0版之前,即(無對齊)模式。但如果任何的索引不一致時,將會拋出一個 FutureWarning
警告,因為在未來的版本中,默認行為將改為join='left' 。
join
的選項為('left'
, 'outer'
, 'inner'
, 'right'
)中的一個。 特別的,對齊操作使得兩個對象可以是不同的長度。
In [59]: v = pd.Series(['z', 'a', 'b', 'd', 'e'], index=[-1, 0, 1, 3, 4])
In [60]: s
Out[60]:
0 a
1 b
2 c
3 d
dtype: object
In [61]: v
Out[61]:
-1 z
0 a
1 b
3 d
4 e
dtype: object
In [62]: s.str.cat(v, join='left', na_rep='-')
Out[62]:
0 aa
1 bb
2 c-
3 dd
dtype: object
In [63]: s.str.cat(v, join='outer', na_rep='-')
Out[63]:
-1 -z
0 aa
1 bb
2 c-
3 dd
4 -e
dtype: object
當others
是一個數(shù)據(jù)表
時,也可以執(zhí)行相同的對齊操作:
In [64]: f = d.loc[[3, 2, 1, 0], :]
In [65]: s
Out[65]:
0 a
1 b
2 c
3 d
dtype: object
In [66]: f
Out[66]:
0 1
3 d d
2 NaN c
1 b b
0 a a
In [67]: s.str.cat(f, join='left', na_rep='-')
Out[67]:
0 aaa
1 bbb
2 c-c
3 ddd
dtype: object
所有的一維,類列表對象都可以任意組合進一個類列表的容器(包括迭代器,dict-視圖等):
In [68]: s
Out[68]:
0 a
1 b
2 c
3 d
dtype: object
In [69]: u
Out[69]:
1 b
3 d
0 a
2 c
dtype: object
In [70]: s.str.cat([u, u.to_numpy()], join='left')
Out[70]:
0 aab
1 bbd
2 cca
3 ddc
dtype: object
除了那些有索引的,所有傳入沒有索引的元素(如np.ndarray
)必須與序列
或索引
有相同的長度。但是,只要禁用對齊join=None
,那么序列
或索引
就可以是任意長度。
In [71]: v
Out[71]:
-1 z
0 a
1 b
3 d
4 e
dtype: object
In [72]: s.str.cat([v, u, u.to_numpy()], join='outer', na_rep='-')
Out[72]:
-1 -z--
0 aaab
1 bbbd
2 c-ca
3 dddc
4 -e--
dtype: object
如果在一個包含不同的索引的others
列表上使用join='right'
,所有索引的并集將會被作為最終拼接的基礎:
In [73]: u.loc[[3]]
Out[73]:
3 d
dtype: object
In [74]: v.loc[[-1, 0]]
Out[74]:
-1 z
0 a
dtype: object
In [75]: s.str.cat([u.loc[[3]], v.loc[[-1, 0]]], join='right', na_rep='-')
Out[75]:
-1 --z
0 a-a
3 dd-
dtype: object
你可以使用 []
方法來直接索引定位。如果你的索引超過了字符串的結尾,將返回NaN
。
In [76]: s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan,
....: 'CABA', 'dog', 'cat'])
....:
In [77]: s.str[0]
Out[77]:
0 A
1 B
2 C
3 A
4 B
5 NaN
6 C
7 d
8 c
dtype: object
In [78]: s.str[1]
Out[78]:
0 NaN
1 NaN
2 NaN
3 a
4 a
5 NaN
6 A
7 o
8 a
dtype: object
警告
在 0.18.0中,extract
擁有了 expand
參數(shù)。當 expand=False
時, 將返回一個序列,索引或者數(shù)據(jù)表, 這取決于原對象和正則表達式(之前的版本也是如此)。當 expand=True
時,它則總是返回一個DataFrame
,這樣可以更加一致,并且減少用戶的混淆。 Expand=True
從0.23.0版本之后成為默認值。
extract
方法接受一個至少含有一個捕獲組的 正則表達式
使用超過一個捕獲組的正則表達式則會提取并返回一個數(shù)據(jù)表,每一列為一個捕獲組。
In [79]: pd.Series(['a1', 'b2', 'c3']).str.extract(r'([ab])(\d)', expand=False)
Out[79]:
0 1
0 a 1
1 b 2
2 NaN NaN
沒有成功匹配的元素將會返回一行NaN
。因此,一個序列的混亂的字符串可以被‘轉換’為一個類似索引的序列或數(shù)據(jù)表。返回的內容會更為清爽,而且不需要使用get()
方法來訪問元組中的成員或者re.match
對象。返回的類型將總是object
類,即使匹配失敗,返回的全是NaN
。
有名稱的捕獲組,如:
In [80]: pd.Series(['a1', 'b2', 'c3']).str.extract(r'(?P<letter>[ab])(?P<digit>\d)',
....: expand=False)
....:
Out[80]:
letter digit
0 a 1
1 b 2
2 NaN NaN
可選組類似,如:
In [81]: pd.Series(['a1', 'b2', '3']).str.extract(r'([ab])?(\d)', expand=False)
Out[81]:
0 1
0 a 1
1 b 2
2 NaN 3
也可以被使用。注意,任何有名稱的捕獲組,其名稱都會被用做列名,否則將會直接使用數(shù)字。
如果僅使用正則表達式捕獲一個組,而expand=True
,那么仍然將返回一個數(shù)據(jù)表
。
In [82]: pd.Series(['a1', 'b2', 'c3']).str.extract(r'[ab](\d)', expand=True)
Out[82]:
0
0 1
1 2
2 NaN
如果expand=False
,則會返回一個序列
。
In [83]: pd.Series(['a1', 'b2', 'c3']).str.extract(r'[ab](\d)', expand=False)
Out[83]:
0 1
1 2
2 NaN
dtype: object
在索引
上使用正則表達式,并且僅捕獲一個組時,將會返回一個數(shù)據(jù)表
,如果expand=True
。
In [84]: s = pd.Series(["a1", "b2", "c3"], ["A11", "B22", "C33"])
In [85]: s
Out[85]:
A11 a1
B22 b2
C33 c3
dtype: object
In [86]: s.index.str.extract("(?P<letter>[a-zA-Z])", expand=True)
Out[86]:
letter
0 A
1 B
2 C
如果expand=False
,則返回一個Index
。
In [87]: s.index.str.extract("(?P<letter>[a-zA-Z])", expand=False)
Out[87]: Index(['A', 'B', 'C'], dtype='object', name='letter')
如果在索引
上使用正則并捕獲多個組,則返回一個數(shù)據(jù)表
,如果expand=True
。
In [88]: s.index.str.extract("(?P<letter>[a-zA-Z])([0-9]+)", expand=True)
Out[88]:
letter 1
0 A 11
1 B 22
2 C 33
如果 expand=False
,則拋出ValueError
。
>>> s.index.str.extract("(?P<letter>[a-zA-Z])([0-9]+)", expand=False)
ValueError: only one regex group is supported with Index
下面的表格總結了extract (expand=False)
時的行為(輸入對象在第一列,捕獲組的數(shù)量在第一行)
1 group | >1 group |
---|---|
Index | Index |
Series | Series |
v0.18.0. 新加入
不同于 extract
(只返回第一個匹配)
In [89]: s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"])
In [90]: s
Out[90]:
A a1a2
B b1
C c1
dtype: object
In [91]: two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'
In [92]: s.str.extract(two_groups, expand=True)
Out[92]:
letter digit
A a 1
B b 1
C c 1
extractall
方法返回所有的匹配。extractall
總是返回一個帶有行多重索引
的數(shù)據(jù)表
,最后一級多重索引
被命名為match
,它指出匹配的順序
In [93]: s.str.extractall(two_groups)
Out[93]:
letter digit
match
A 0 a 1
1 a 2
B 0 b 1
C 0 c 1
當所有的對象字串都只有一個匹配時,
In [94]: s = pd.Series(['a3', 'b3', 'c2'])
In [95]: s
Out[95]:
0 a3
1 b3
2 c2
dtype: object
extractall(pat).xs(0, level='match')
的返回與extract(pat)
相同。
In [96]: extract_result = s.str.extract(two_groups, expand=True)
In [97]: extract_result
Out[97]:
letter digit
0 a 3
1 b 3
2 c 2
In [98]: extractall_result = s.str.extractall(two_groups)
In [99]: extractall_result
Out[99]:
letter digit
match
0 0 a 3
1 0 b 3
2 0 c 2
In [100]: extractall_result.xs(0, level="match")
Out[100]:
letter digit
0 a 3
1 b 3
2 c 2
索引
也支持.str.extractall
。 它返回一個數(shù)據(jù)表
,其中包含與Series.str.estractall
相同的結果,使用默認索引(從0開始)
v0.19.0. 新加入
In [101]: pd.Index(["a1a2", "b1", "c1"]).str.extractall(two_groups)
Out[101]:
letter digit
match
0 0 a 1
1 a 2
1 0 b 1
2 0 c 1
In [102]: pd.Series(["a1a2", "b1", "c1"]).str.extractall(two_groups)
Out[102]:
letter digit
match
0 0 a 1
1 a 2
1 0 b 1
2 0 c 1
你可以檢查是否一個元素包含一個可以匹配到的正則表達式:
In [103]: pattern = r'[0-9][a-z]'
In [104]: pd.Series(['1', '2', '3a', '3b', '03c']).str.contains(pattern)
Out[104]:
0 False
1 False
2 True
3 True
4 True
dtype: bool
或者是否元素完整匹配一個正則表達式
In [105]: pd.Series(['1', '2', '3a', '3b', '03c']).str.match(pattern)
Out[105]:
0 False
1 False
2 True
3 True
4 False
dtype: bool
match
和contains
的區(qū)別是是否嚴格匹配。match
嚴格基于re.match
,而contains
基于re.search
。
類似match
, contains
, startswith
和 endswith
可以傳入一個額外的na
參數(shù),因此,因此缺失值在匹配時可以被認為是True
或者False
:
In [106]: s4 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
In [107]: s4.str.contains('A', na=False)
Out[107]:
0 True
1 False
2 False
3 True
4 False
5 False
6 True
7 False
8 False
dtype: bool
你從字符串列可以抽出一個啞變量。例如,是否他們由|
分割:
In [108]: s = pd.Series(['a', 'a|b', np.nan, 'a|c'])
In [109]: s.str.get_dummies(sep='|')
Out[109]:
a b c
0 1 0 0
1 1 1 0
2 0 0 0
3 1 0 1
索引也支持get_dummies
,它返回一個多重索引:
v0.18.1. 新加入
In [110]: idx = pd.Index(['a', 'a|b', np.nan, 'a|c'])
In [111]: idx.str.get_dummies(sep='|')
Out[111]:
MultiIndex([(1, 0, 0),
(1, 1, 0),
(0, 0, 0),
(1, 0, 1)],
names=['a', 'b', 'c'])
參見 get_dummies()
方法 | 描述 |
---|---|
cat() | 拼接字符串 |
split() | 基于分隔符切分字符串 |
rsplit() | 基于分隔符,逆向切分字符串 |
get() | 索引每一個元素(返回第i個元素) |
join() | 使用傳入的分隔符依次拼接每一個元素 |
get_dummies() | 用分隔符切分字符串,并返回一個含有啞變量的數(shù)據(jù)表 |
contains() | 返回一個布爾矩陣表明是每個元素包含字符串或正則表達式 |
replace() | 將匹配到的子串或正則表達式替換為另外的字符串,或者一個可調用對象的返回值 |
repeat() | 值復制(s.str.repeat(3)等價于x * 3) |
pad() | 將白空格插入到字符串的左、右或者兩端 |
center() | 等價于str.center |
ljust() | 等價于str.ljust |
rjust() | 等價于str.rjust |
zfill() | 等價于str.zfill |
wrap() | 將長字符串轉換為不長于給定長度的行 |
slice() | 將序列中的每一個字符串切片 |
slice_replace() | 用傳入的值替換每一個字串中的切片 |
count() | 對出現(xiàn)符合的規(guī)則進行計數(shù) |
startswith() | 等價于str.startswith(pat) |
endswith() | 等價于 str.endswith(pat) |
findall() | 返回每一個字串中出現(xiàn)的所有滿足樣式或正則的匹配 |
match() | 素調用 re.match ,并以列表形式返回匹配到的組 |
extract() | Call 對每一個元素調用 re.search , 并以數(shù)據(jù)表的形式返回。行對應原有的一個元素,列對應所有捕獲的組 |
extractall() | 一個元素調用 re.findall , 并以數(shù)據(jù)表的形式返回。行對應原有的一個元素,列對應所有捕獲的組 |
len() | 計算字符串長度 |
strip() | 等價于str.strip |
rstrip() | 等價于str.rstrip |
lstrip() | 等價于str.lstrip |
partition() | 等價于 str.partition |
rpartition() | 等價于 str.rpartition |
lower() | 等價于 str.lower |
casefold() | 等價于 str.casefold |
upper() | 等價于 str.upper |
find() | 等價于str.find |
rfind() | 等價于 str.rfind |
index() | 等價于 str.index |
rindex() | 等價于 str.rindex |
capitalize() | 等價于 str.capitalize |
swapcase() | 等價于 str.swapcase |
normalize() | 返回Unicode 標注格式。等價于 unicodedata.normalize |
translate() | 等價于 str.translate |
isalnum() | 等價于 str.isalnum |
isalpha() | 等價于 str.isalpha |
isdigit() | 等價于 str.isdigit |
isspace() | 等價于 str.isspace |
islower() | 等價于 str.islower |
isupper() | 等價于 str.isupper |
istitle() | 等價于 str.istitle |
isnumeric() | 等價于 str.isnumeric |
isdecimal() | 等價于 str.isdecimal |
更多建議: