1. 程式人生 > >走入計算機的第二十五天(內置模塊3之正則表達式)

走入計算機的第二十五天(內置模塊3之正則表達式)

不同的 hello col font 數字 ans -a class 本質

一 什麽是正則表達式

就其本質而言,正則表達式(或 RE)是一種小型的、高度專業化的編程語言,(在Python中)它內嵌在Python中,並通過 re 模塊實現。正則表達式模式被編譯成一系列的字節碼,然後由用 C 編寫的匹配引擎執行。

正則表達式的功能:字符串的模糊匹配查詢。

二 re模塊

不同的語言均有使用正則表達式的方法,python中是用re模塊實現的。

使用的方法格式:變量名=re.re中的其中一個子模塊("規則","內容")

元字符

1 .(點) :可以代替除換行符以外任意一個元素

1 # ret=re.findall("方..","方傑,方合意,方磊,光東,阿傑,李傑,方何軍")    ##匹配出所有符合條件的元素
2 # print(ret)

2 ^ :匹配第一個 元素的類容,匹配不成功,也不會去匹配後面的元素

# ret=re.findall("^方.","方傑,方合意,方磊,光東,阿傑,李傑,方何軍")   #匹配出所有符合條件的元素
# print(ret)

3 $ :匹配該對象的最後一個內容,不會去匹配其他位置的內容

 ret=re.findall("y..n$","方傑,方合意,方磊,光東,阿傑,李傑,方何軍yuan")   #匹配出所有符合條件的元素
# print(ret)

4 * :匹配表達式內容的0次到無數次

#ret=re.findall("333\d*","333234214455,333255654534246,545556564367656653,4453576489780423")
# print(ret)

5 + : 匹配表達式內容的1次到無數次

#ret=re.findall("333\d+","3334214455,333255654534246,333,56564367656653,4453576489780423")
# print(ret)

6 ?: 匹配表達式內容的0次或者1次

# ret=re.findall("\d?","2342,43,7654,87")
# print(ret)

7 {}:自定義次數

#ret=re.findall("\d{16}","234214455,663255654534246,545556564367656653,4453576489780423")
# print(ret)

*,+,?等都是貪婪匹配,也就是盡可能匹配,後面加?號使其變成惰性匹配

# ret=re.findall(‘131\d+?‘,‘1312312312‘)
# print(ret) 

匹配一個數字包括整型和浮點型

# ret=re.findall("\d+\.?\d+","3555,8498,64.674,2344")
# print(ret)

轉義符

1 反斜杠後面跟元字符,會去掉特殊的功能

# ret=re.findall("\.com","www.baidu.com,www.youji.com,www.xiongdi.com,www.ss.cn")
# print(ret)

2 反斜杠後面加上一些普通字符會實現一些特殊的功能

\d 匹配任何十進制數; 它相當於類 [0-9]。

# ret=re.findall("\d","yuan3236$655&34")
# print(ret)

\D 匹配任何非數字字符; 它相當於類 [^0-9]。

# ret=re.findall("\D","yuan3236$655&34")
# print(ret)

\s 匹配任何空白字符; 它相當於類 [ \t\n\r\f\v]。

# ret=re.findall("\s","hello i love like")
# print(ret)

\S 匹配任何非空白字符; 它相當於類 [^ \t\n\r\f\v]。

# ret=re.findall("\S","hello i love like")
# print(ret)

\w 匹配任何字母數字字符; 它相當於類 [a-zA-Z0-9_]。

# ret=re.findall("\w","yuan323665534")
# print(ret)


# ret=re.findall("\w+","yuan323665534")
# print(ret)

\W 匹配任何非字母數字字符; 它相當於類 [^a-zA-Z0-9_]

# ret=re.findall("\W","yuan3236$655&34")
# print(ret)

\b 匹配一個特殊字符邊界,比如空格 ,&,#等\b是特殊符號所以前面需要加r

# ret=re.findall(r"i\b","hello i love like")
# print(ret)

# ret=re.findall(r"i\b","hello i love li$ke")
# print(ret)

分組 ()


ret=re.findall("(fang)","fangffksdl;hfangfangfnag") # print(ret) # # ret=re.findall("(fang)+","fangffksdl;hfangfangfnag") # print(ret)
# ret=re.findall("方","方傑,方合意,方磊,光東,阿傑,李傑,方何軍")    ##匹配出所有符合條件的元素
# print(ret)
m = re.findall(r(ad)+, add) print(m) ret=re.search((?P<id>\d{2})/(?P<name>\w{3}),23/com) print(ret.group())#23/com print(ret.group(id))#23



#命名分組
ret=re.search(r"blog-aticles-(?P<year>20[01]\d)-(\d+)","blog-aticles-2005-12")
print(ret.group(‘year‘))

ret=re.search(r"blog-aticles-(?P<year>20[01]\d)-(?P<mansh>\d+)","blog-aticles-2005-12")
print(ret.group(‘mansh‘))

字符集 |

字符集 | 或者的意思 要配合 ()用的

# ret=re.findall("www\.(\w+)\.(com|cn)","www.baidu.com,www.youji.com,www.xiongdi.com,www.ss.cn")
# print(ret)

# ret=re.findall("www\.(?:\w+)\.(?:com|cn)","www.baidu.com,www.youji.com,www.xiongdi.com,www.ss.cn")
# print(ret)

字符集 []

字符集[]:  在[]裏面多選一的效果  一個字符集只匹配一個字符
# ret=re.findall(r"a[bc]","abcjpofdabhiac")
# print(ret)

# ret=re.findall(r"a[bc]d","abdcjpofdabhiacd")
# print(ret)

# ret=re.findall(r"a[b.c]d","abcjpofdabhia.dc")
# print(ret)
字符集裏面只有三個特殊符號:- ^ \
# ret=re.findall(r"[0-9]","ds1246634347cvkdhsd")
# print(ret)
#
#
# ret=re.findall(r"[a-z]","ds1246634347cvkdhsd")
# print(ret)
#
# ret=re.findall(r"[A-Z]","ds1246DSJFKS47cvkdhsd")
# print(ret)
#
# ret=re.findall(r"[A-Za-z0-9]","ds1246634347cvkdhsd")
# print(ret)

# ret=re.findall(r"a[\d]c","ds12a34c7cvkdhsd")
# print(ret)


# ret=re.findall(r"[^\d]","ds1246634347cvkdhsd")
# print(ret)


# ret=re.findall(r"[^\da-z]","ds1246634347cvk#dhsd")
# print(ret)

search 函數會在字符串內查找模式匹配,只到找到第一個匹配然後返回一個包含匹配信息的對象,沒有則會則返回None,該對象可以通過調用group()方法得到匹配的字符串,如果字符串沒有匹配,就會報錯

#只有匹配到了一項內容就不會在繼續匹配了
ret=re.search("(fang)+","fangffksdl;hfangfangfnag")
print(ret)
print(ret.group())

#沒有匹配內容則會返回None,group()則會報錯報錯
ret=re.search("(fakl)+","fangffksdl;hfangfangfnag")
print(ret)
print(ret.group())

match 函數會在字符串開始位置查找模式匹配對象,沒有則會則返回None,該對象可以通過調用group()方法得到匹配的字符串,如果字符串沒有匹配,就會報錯

#match  只匹配字符串開頭的位置
# ret=re.match("(fang)+","fangffksdl;hfangfangfnag")
# print(ret)
# print(ret.group())

#開頭位置匹配不上就會報錯
# ret=re.match("(fang)+","sdffangffksdlaihngfangfnag")
# print(ret)
# print(ret.group())

 

走入計算機的第二十五天(內置模塊3之正則表達式)