Python Regular Expression 正則表示式
個人常用的正則表示式
import re
確認進來的字串是否為 數+字母+數+字母+數+字母+數+字母+數+字母+數+字母
a = "1f2g3h4j5k6k" b="11g4j5k6k5k5j"
match會從字串開頭比對,所以
re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", a) -> 返回物件
re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", b) -> None
serach字串中有符合即可找到
re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", a) -> 返回物件
re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", b) -> 返回物件
去除空白鍵
a = "a b c d e f"
re.sub("\s+", "", a) -> "abcdef" (將空白分隔用空字元取代)
分割字串
a = "kk(L)bb" , b="a b cd e f", c="abc11abc1111abc1111111abc"
re.split("\s+", a) =>[kk(L)bb]
re.split("\s+", b) ->[a, b, cd, e, f]
re.split("\(.+\)", a) -> [kk, bb]
re.split("1{3,5}", c) -> ['abc11abc', 'abc', '11abc'] (大括號指3個到5個"1")
re.sub("1{3,5}", "2", c) -> 'abc11abc2abc211abc'
小記憶
\d 就是[0-9]
\D就是[^0-9]
re.sub("\d", "?", c) -> 'abc??abc????abc???????abc'
re.sub("\D", "?", c) -> '???11???1111???1111111???'
re.findall("\d+", c) -> ['11', '1111', '1111111']
\s 是任何空白鍵
\S 非任何空白鍵
. 是任意字元
? 是前方字元出現零次或一次。如sa?, 會找出s, sa。
* 是前方字元出現零次或更多次。如sa*,會找出s, sa, saa, saaa..
+ 是前方字元出現一次或更多次。如sa+,會找出sa, saa, saaaa...
(?=...)
a = 'is good is bad, is android'
k= re.search("is\s+(?=bad)", a) -> print k.group() 會得到 is ,這個is就是指bad前的那個is。這樣我們可以理解,(?=...)指的是後面跟著… 的東西。以我們這個例子就是後面跟著bad的is。
試試取代看看
re.sub("is\s+(?=bad)", "new", a) -> 'is good newbad, is android'
(?!...)
這樣我們可以理解,(?!...)後面不跟著bad的is。
re.sub("is\s+(?!bad)", "new", a) -> 'newgood is bad, newandroid'
import re
確認進來的字串是否為 數+字母+數+字母+數+字母+數+字母+數+字母+數+字母
a = "1f2g3h4j5k6k" b="11g4j5k6k5k5j"
match會從字串開頭比對,所以
re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", a) -> 返回物件
re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", b) -> None
serach字串中有符合即可找到
re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", a) -> 返回物件
re.match("[0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z][0-9][a-z]", b) -> 返回物件
去除空白鍵
a = "a b c d e f"
re.sub("\s+", "", a) -> "abcdef" (將空白分隔用空字元取代)
分割字串
a = "kk(L)bb" , b="a b cd e f", c="abc11abc1111abc1111111abc"
re.split("\s+", a) =>[kk(L)bb]
re.split("\s+", b) ->[a, b, cd, e, f]
re.split("\(.+\)", a) -> [kk, bb]
re.split("1{3,5}", c) -> ['abc11abc', 'abc', '11abc'] (大括號指3個到5個"1")
re.sub("1{3,5}", "2", c) -> 'abc11abc2abc211abc'
小記憶
\d 就是[0-9]
\D就是[^0-9]
re.sub("\d", "?", c) -> 'abc??abc????abc???????abc'
re.sub("\D", "?", c) -> '???11???1111???1111111???'
re.findall("\d+", c) -> ['11', '1111', '1111111']
\s 是任何空白鍵
\S 非任何空白鍵
. 是任意字元
? 是前方字元出現零次或一次。如sa?, 會找出s, sa。
* 是前方字元出現零次或更多次。如sa*,會找出s, sa, saa, saaa..
+ 是前方字元出現一次或更多次。如sa+,會找出sa, saa, saaaa...
(?=...)
a = 'is good is bad, is android'
k= re.search("is\s+(?=bad)", a) -> print k.group() 會得到 is ,這個is就是指bad前的那個is。這樣我們可以理解,(?=...)指的是後面跟著… 的東西。以我們這個例子就是後面跟著bad的is。
試試取代看看
re.sub("is\s+(?=bad)", "new", a) -> 'is good newbad, is android'
(?!...)
這樣我們可以理解,(?!...)後面不跟著bad的is。
re.sub("is\s+(?!bad)", "new", a) -> 'newgood is bad, newandroid'
留言
張貼留言