1. 程式人生 > >Python的學習筆記DAY10---關於正則表示式

Python的學習筆記DAY10---關於正則表示式

        正則表示式用來匹配查詢文字和資料,簡單的說,是一些由字元和特殊符號組成的字串,描述了模式的重複或者表述多個字元。其能按照某種模式匹配一系列有相似特徵的字串。

        Python中的正則表示式通過re模組來支援。

        首先是元字元。正則表示式語言由兩種基本字元型別組成:原義(正常)文字字元和元字元。元字元使正則表示式具有處理能力。所謂元字元就是指那些在正則表示式中具有特殊意義的專用字元,可以用來規定其前導字元(即位於元字元前面的字元)在目標物件中的出現模式。

        常用的元字元有  “.”,“|”,“^”,“$”,“\”等,使用舉例如下:

#.的使用
ma = re.match(r'...','0a!')
ma.group()
>>>'0a!'

ma = re.match(r'...','0a\n')
ma.group()
>>>AttributeError: 'NoneType' object has no attribute 'group'

“.”可以匹配除了換行之外的任意字元,上面程式碼中的“...”匹配到了“0a!”三個字元,而在下面的程式碼中最後一個是換行,所以沒有匹配到,所以ma是一個NoneType。

#|的使用
ma = re.match(r'...|..','0a\n')
ma.group()
>>>'0a'
“a|b”表示匹配正則表示式a或者b,上面的例子裡成功的匹配到了字元

#[]的使用
ma = re.match(r'[ab]','a')
ma.group()
>>>'a'

ma = re.match(r'[ab]','b')
ma.group()
>>>'b'

ma = re.match(r'[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]','fF6')
ma.group()
>>>'fF6'
“[...]”用來匹配字符集,“[]”裡表示一個範圍,可以指定,也可以用“-”相連表示範圍。

# \d \D \s \S \w \W的使用
ma = re.match(r'\d\d\D\D','12a$')
ma.group()
>>>'12a$'
ma = re.match(r'\d\d\D\D','a$12')
ma.group()
>>>AttributeError: 'NoneType' object has no attribute 'group'

ma = re.match(r'\s\s\S\S','  ss')
ma.group()
>>>'  ss'
ma = re.match(r'\s\s\S\S','ss  ')
ma.group()
>>>AttributeError: 'NoneType' object has no attribute 'group'

ma = re.match(r'\w\w\W\W','a1  ')
ma.group()
>>>'a1  '
ma = re.match(r'\w\w\W\W','  a1')
ma.group()
>>>AttributeError: 'NoneType' object has no attribute 'group'
“\d”來表示一個數字,“\D”表示一個非數字,“\s”表示一個空白,“\S”表示一個非空白,“\w“表示一個單詞字元,”\W”表示非單詞字元。

#* + ? {}的使用
ma = re.match(r'.*','')
ma.group()
>>>''
ma = re.match(r'.*','aaaaaaaaaaa')
ma.group()
>>>'aaaaaaaaaaa'

ma = re.match(r'.+','a')
ma.group()
>>>'a'

ma = re.match(r'.+','aaaa')
ma.group()
>>>'aaaa'

ma = re.match(r'.?','a')
ma.group()
>>>'a'
ma = re.match(r'.?','')
ma.group()
>>>''

ma = re.match(r'.{3,5}','1234')
ma.group()
>>>'1234'
ma = re.match(r'.{3,5}','123456789')
ma.group()
>>>'12345'
如上程式碼顯示*表示一個字元重複0-N次,+代表重複1-N次,?表示重複0-1次,{a,b}表示重複a-b次。
#^ $ 的使用
ma = re.match(r'^a..','abc')
ma.group()
>>>'abc'
ma = re.match(r'^a..','bac')
ma.group()
>>>AttributeError: 'NoneType' object has no attribute 'group'

ma = re.match(r'..c$','abc')
ma.group()
>>>'abc'
ma = re.match(r'..c$','acb')
ma.group()
>>>AttributeError: 'NoneType' object has no attribute 'group'

^表示字串以^後面的字元作為開頭,$表示字串以$前面的字元結尾。

        以上的正則表示式均是使用match方法來匹配的,match是從頭開始匹配,正則表示式的常用方法有很多,例如serach和findall。程式碼舉例如下:

#search 和 findall 的使用
str = 'a100,b200,c300,d400'
ma = re.search(r'\d+',str)
ma.group()
>>>'100'
ma = re.findall(r'\d+',str)
ma
>>>['100', '200', '300', '400']

search用來在字串中搜索對應的子字串,搜尋到第一個停止,findall用來搜尋所有符合規定的字串並返回一個列表。

        sub和split方法:

#sub 和 spilt 的使用
str = 'abc1234def'
m = re.sub(r'\d+','5678',str)
m
>>>'abc5678def'

str = 'name:蒼井空 鬆島楓 瀧澤蘿拉,小澤瑪利亞'
re.split(r':| |,',str)
>>>['name', '蒼井空', '鬆島楓', '瀧澤蘿拉', '小澤瑪利亞']
sub用來將查詢到的字串替換,spilt用於將字串分割。