1. 程式人生 > >python 正則表示式(二) 元字元使用規則

python 正則表示式(二) 元字元使用規則

1)----------匹配單個字元與數字------

.               -->匹配除換行符以外的任意字元  
[]              -->[]是字元集合,表示匹配[]中所包含的任意一個字元
[a-z]           -->匹配任意小寫字母
[A-Z]           -->匹配任意大寫字母
[0-9]           -->匹配任意數字,和[0123456789]效果一樣
[0-9a-zA-Z]     -->匹配任意的數字和字母
[0-9a-zA-Z_]    -->匹配任意的數字、字母和下劃線
[^sun]          -->匹配除了sun這三個字元之外的所有字元
^稱為脫字元,表示不匹配集合中的字元  -->英文輸入模式下,按Shite + 6
\d              -->匹配數字,和[0123456789]、[0-9]效果一樣
\D              -->匹配非數字字元,和[^0-9]效果一樣
\w              -->匹配任意的數字、字母和下劃線,效果同[0-9a-zA-Z_]
\W              -->匹配非數字、字母和下劃線,效果同[^0-9a-zA-Z_]
\s              -->匹配任意的空白符(空格,換行,回車,換頁,指標),效果同[ \f\n\r\t]
\S              -->匹配任意的非空白符(空格,換行,回車,換頁,指標),效果同[^ \f\n\r\t]


2)----------錨字元(邊界字元)------
^               -->行首匹配,和在[]中使用^時效果不同
$               -->行尾匹配
\A              -->只匹配字串開始,它和^的區別時:\A只匹配整個字串的開頭,
                   即便在re.M模式下,也不會匹配其它行的行首
\Z              -->只匹配字串結尾,它和$的區別時:\Z只匹配整個字串的結尾,
                   即便在re.M模式下,也不會匹配其它行的行尾
\b              -->匹配一個單詞(\b的位置就是單詞結束的位置)
\B              -->匹配非單詞邊界

3)----------匹配多個字元------
說明:下方的x,y,z均為假設的普通字元,不具有特殊一樣
(xyz)           -->匹配小括號內的xyz(作為一個整體)
x?              -->匹配0個或者一個x        非貪婪匹配(儘可能少的匹配)
x*              -->匹配0個或者任意多個x    貪婪匹配(儘可能多的匹配)
x+              -->匹配至少一個x
x{n}            -->匹配確定的n個x(n事一個非負整數) 
x{n,}           -->匹配至少n個x(n事一個非負整數) 
x{n,m}          n <= 匹配個數 <=m (匹配n個到m個x)
x|y             -->表示或,匹配的是x或y

4)----------特殊------
*? +? x?  最小匹配  通常都是儘可能多的匹配,可以使用這種解決貪婪匹配
對於str = "start part1 stop start part2 stop start part3 stop"
如果用r"start.*stop",則是貪婪匹配  .*儘可能匹配的長一些,匹配結果就是最長的一串
['start part1 stop start part2 stop start part3 stop']

而如果用r"start.*?stop",則是貪婪匹配  .*?儘可能匹配的短一些,匹配結果就是所有的短串
['start part1 stop', 'start part2 stop', 'start part3 stop']

5)匹配的內容中包含有正則表示式的元字元怎麼辦?
如 str = "2*3=6",想要匹配2*,以及其位置spen,使用r"2*"是不行的
使用\*將*作為普通字元,不作為正則表示式的元字元,r"2\*"
#手機號碼匹配:r"^1(([3578]\d)|(47))\d{8}$"
#如果是在字串中查詢,則r"1(([3578]\d)|(47))\d{8}",去掉首尾限制
lstr = ["1321234567","13212345678","132123456780","1321234567a",
        "23212345678","14712345678"]
for ss in lstr:
    print(re.search(r"^1(([3578]\d)|(47))\d{8}$",ss))

#demo1 練習使用.
# 匹配.n
print(re.search(".n","the sun is shine")) #匹配到第一個符合的字串"un"

#demo2 練習使用[]
#找到一個字串中的所有數字
listNum = re.findall("[1234567890]","t1od3ay is goo4d t1y5i2")
print(listNum)

#demo 練習使用行首匹配^
print(re.search("^sun","the sun is shine"))#不能匹配到,因為sun不在行首
print(re.search("^sun","sun,the sun is shine"))#能匹配到,因為sun在行首

#demo 練習使用\A  前面加'r',以防其中包含轉義字元
print(re.findall("^the","the sun is shine\nthe sun is shine\nthe sun is shine\n",re.M))
print(re.findall(r"\Athe","the sun is shine\nthe sun is shine\nthe sun is shine\n",re.M))

#demo 練習使用\b  前面加'r',以防其中包含轉義字元
#能找到前三個sun,他們以' '及','為邊界結尾,sune也包含了sun,但不能找到
print(re.findall(r"sun\b","sun the sun is sun,sune"))

#demo 練習使用\B  前面加'r',以防其中包含轉義字元
#只找到一個sun
print(re.findall(r"sun\B","sun the sun is sun,sune"))
#改用search函式,發現spen =(19,22),就是sune的位置
print(re.search(r"sun\B","sun the sun is sun,sune"))


#demo
print(re.findall(r"s+","sun the ssn is sss,sune"))

#demo
print(re.findall(r"s{3}","sun the ssn is sss,sune"))

#demo
print(re.findall(r"s{2,}","sun the ssn is sss,sune"))

#demo
print(re.findall(r"s{1,2}","sun the ssn is sss,sune"))

#demo
print(re.findall(r"((s|S)un)","sun the ssn is sss,Sune"))

# 提取 sun...day
str = "sun the ssn is sss,Sune,today"
print(re.findall(r"^sun.*day$",str))

str2 ="start part1 stop start part2 stop start part3 stop"
print(re.findall(r"start.*stop",str2))

str2 ="start part1 stop start part2 stop start part3 stop"
print(re.findall(r"start.*?stop",str2))

str3 = "2*3=6"
print(re.search(r"2*",str3)) #只能找到2,而不能找到2*
print(re.search(r"2\*",str3)) #\*將*作為普通字元,不作為正則表示式的元字元