re模塊(詳解正則)


 

re模塊

imort re

1、\w  \W

print(re.findall('\w','ab 12\+- _*&')) #\w 匹配字母 數字 及下划線
執行結果:['a', 'b', '1', '2', '_']

print(re.findall('\W','ab 12\+- _*&')) #\w 匹配非字母 數字 及下划線
執行結果:[' ', '\\', '+', '-', ' ', '*', '&']

2、\s  \S

print(re.findall('\s','ab 12\+- _*&')) #\s 匹配任意空白字符,等價於[\t\n\r\f]
執行結果:[' ', ' ']

print(re.findall('\S','ab 12\+- _*&')) #\s 匹配非空白字符
執行結果:['a', 'b', '1', '2', '\\', '+', '-', '_', '*', '&']

3、\d  \D

print(re.findall('\d','ab 12\+- _*&')) #\s 匹配任意數字,等價於[0-9]
執行結果:['1', '2']

print(re.findall('\D','ab 12\+- _*&')) #\s 匹配非數字
執行結果:['a', 'b', ' ', '\\', '+', '-', ' ', '_', '*', '&']

綜合:

print(re.findall('\w_sb','egon alex_sb12332wxx_sb,lxx_sb'))
執行結果:['x_sb', 'x_sb', 'x_sb']

4、\A  基本上不用

print(re.findall('\Aalex','alex isalex sb'))#從頭開始匹配只匹配第一個alex
執行結果:['alex']

print(re.findall('alex','alex isalex sb'))
執行結果:['alex', 'alex']

5、\^

print(re.findall('^alex','alex is salexb'))#從頭開始匹配,匹配到第一個則不往后匹配
執行結果:['alex']

print(re.findall('sb','alexsb is sbalexsb'))#從頭開始匹配,匹配所有
執行結果:['sb', 'sb', 'sb']

print(re.findall('^sb','alexsb is sbalexsb'))#從頭開始匹配,第一個沒有則不往后面匹配
執行結果:[]

6、\Z  \$

print(re.findall('sb\Z','alexsb is sbalexsb'))#從尾部開始匹配,匹配到則不往前匹配
執行結果:['sb']

print(re.findall('sb$','alexsb is sbalexsb'))#從尾部開始匹配,匹配到則不往前匹配
執行結果:['sb']

綜合:

print(re.findall('^ebn$','ebn'))#從頭開始找,正反找都是ebn,都可以匹配上
執行結果:['ebn']

7、\n  \t  (同理)

print(re.findall('\n','a\nc a\tc al\nc'))#匹配到\n
執行結果:['\n', '\n']

print(re.findall('a\nc','a\nc a\tc al\nc'))#匹配到['a\nc']
執行結果:['a\nc']

 

重復匹配:  .  ?  *  +  {m,n}  .*  .*?

1、.  :代表除了換行符外的任意一個字符

print(re.findall('a.c','abc alc aAsc aaaaaac'))#匹配以a開頭以c結尾.代表中間的任意一個字符
執行結果:['abc', 'alc', 'aac']

print(re.findall('a.c','abc alc aAc aaaaaa\nc'))#ac中間有換行符\n所以匹配不到a\nc
執行結果:['abc', 'alc', 'aAc']

print(re.findall('a.c','abc alc aAsc aaaaaa\nc',re.DOTALL))#.能匹配ac中間的所有一個字符,包括\n
執行結果:['abc', 'alc', 'a\nc']

2、?  :代表左邊那一個字符重復0次或1次

print(re.findall('ab?','a ab abb abbb abbbb abbbbb albbbbb'))#從頭匹配ab中,b是零個或一個
執行結果:['a', 'ab', 'ab', 'ab', 'ab', 'ab', 'a']

3、*  :代表左邊那一個字符出現0次或無窮次

print(re.findall('ab*','a ab abb abbb abbbb abbbbb albbbbbbb'))#從頭匹配ab中,b是零個或無窮個
執行結果:['a', 'ab', 'abb', 'abbb', 'abbbb', 'abbbbb', 'a']

4、+  :代表左邊那一個字符出現至少一次或無窮次

print(re.findall('ab+','a ab abb abbb abbbb abbbbb albbbbbbb'))#從頭匹配ab中,b是一個或無窮個
執行結果:['ab', 'abb', 'abbb', 'abbbb', 'abbbbb']

5、{m,n}  :代表左邊那一個字符出現m次到n次

print(re.findall('ab?','a ab abb abbb abbbb abbbbb  albbbbbb'))
print(re.findall('ab{0,1}','a ab abb abbb abbbb abbbbb albbbbbb'))
執行結果:['a', 'ab', 'ab', 'ab', 'ab', 'ab', 'a'] , ['a', 'ab', 'ab', 'ab', 'ab', 'ab', 'a']

print(re.findall('ab*','a ab abb abbb abbbb abbbbb albbbbbbb'))
print(re.findall('ab{0,}','a ab abb abbb abbbb abbbbb albbbbbbb'))
執行結果:['a', 'ab', 'abb', 'abbb', 'abbbb', 'abbbbb', 'a'] , ['a', 'ab', 'abb', 'abbb', 'abbbb', 'abbbbb', 'a']

print(re.findall('ab+','a ab abb abbb abbbb abbbbb albbbbbbb'))
print(re.findall('ab{1,}','a ab abb abbb abbbb abbbbb albbbbbbb'))
執行結果:['ab', 'abb', 'abbb', 'abbbb', 'abbbbb'] , ['ab', 'abb', 'abbb', 'abbbb', 'abbbbb']

print(re.findall('ab{1,3}','a ab abb abbb abbbb abbbbb albbbbbbb'))
執行結果:['ab', 'abb', 'abbb', 'abbb', 'abbb']

6、.*  :匹配任意長度,任意的字符=====》貪婪匹配

print(re.findall('a.*c','ac a123c  aaaac a * 123) ()c asdfsdfkjdls'))#盡可能長的匹配
執行結果:['ac a123c  aaaac a * 123) ()c']

7、.*?  :非貪婪匹配

print(re.findall('a.*?c','a123c456c'))#盡可能短的匹配
執行結果:['a123c']

8、()  :分組

print(re.findall('(alex)_sb','alex_sb sfksdfksdalex_sb'))#在匹配到的情況下只留括號內的內容
執行結果:['alex', 'alex']

例子:非貪婪匹配到網址

print(re.findall('href="(.*?)"','<li><a id="blog_nav_sitehome" class="menu" href="https://www.cnblogs.com/happyfei/">博客園</a></li>'))
執行結果:['https://www.cnblogs.com/happyfei/']

9、[]  :匹配一個指定范圍內的字符(這一字符來自於括號內定義的)

print(re.findall('a[0-9]c','a1c a+c a2c a9c a*c a11c a-c acc aAc '))#-號在[]內有特殊意義,如果要匹配帶-號的,-號要放在最前面或最后面
執行結果:['a1c', 'a2c', 'a9c']

print(re.findall('a[-+*]c','a1c a+c a2c a9c a*c a11c a-c acc aAc '))
執行結果:['a+c', 'a*c', 'a-c']

print(re.findall('a[a-zA-Z]c','a1c a+c a2c a9c a*c a11c a-c acc aAc '))
執行結果:['acc', 'aAc']

print(re.findall('a[^a-zA-Z]c','a c a1c a+c a2c a9c a*c a11c a-c acc aAc '))#[]內的^代表取反的意思
執行結果:['a c', 'a1c', 'a+c', 'a2c', 'a9c', 'a*c', 'a-c']

例子:取出_sb

print(re.findall('[a-z]_sb','egon alex_sb12332wxx_sb,lxx_sb'))#[]匹配一個字符后面跟_sb
執行結果:['x_sb', 'x_sb', 'x_sb']

print(re.findall('[a-z]+_sb','egon alex_sb12332wxxxxx_sb,lxx_sb'))#[]+匹配多個字符后面跟_sb
執行結果:['alex_sb', 'wxxxxx_sb', 'lxx_sb']

print(re.findall('([a-z]+)_sb','egon alex_sb12332wxxxxx_sb,lxx_sb'))#只取到_sb的人名
執行結果:['alex', 'wxxxxx', 'lxx']

10、|  :代表或者

print(re.findall('compan(ies|y)','Too many companies have gone bankrupt, and the next none is my company'))#取出公司的英文單詞
執行結果:['ies', 'y']

注:(?:代表取匹配成功的所有內容,而不僅僅只是括號內的內容)

print(re.findall('compan(?:ies|y)','Too many companies have gone bankrupt, and the next none is my company'))
執行結果:['companies', 'company']

print(re.findall('alex|sb','alex sb ssdfsdf  alex sb egon'))
執行結果:['alex', 'sb', 'alex', 'sb']

 

11、re模塊的其他用法

 1 print(re.findall('alex|sb','123123 alex sb sdlfjlsdkegon alex sb egon'))
 2 print(re.search('alex|sb','123123 alex sb sdlfjlsdkegon alex sb egon').group())
 3 #執行結果:['alex', 'sb', 'alex', 'sb'] , alex
 4 
 5 
 6 print(re.search('^alex','alex sb sdlfjlsdkegon alex sb egon').group())#表示從頭開始匹配
 7 print(re.match('alex','alex sb sdlfjlsdkegon alex sb egon').group())#表示從頭開始匹配
 8 #執行結果:alex , alex
 9 
10 
11 info='a:b:c:d'
12 print(info.split(':'))
13 print(re.split(':',info))
14 #執行結果:['a', 'b', 'c', 'd'] , ['a', 'b', 'c', 'd']
15 
16 info='a :c\d/e'
17 print(re.split('[ :\\\/]',info))
18 #執行結果:['a', '', 'c', 'd', 'e']
19 
20 #需求:xxx與Sb調換
21 print(re.sub('(xxx)(.*?)(SB)',r'\3\2\1',r'xxx is SB'))
22 #執行結果:SB is xxx
23 
24 print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)',r'\5\2\3\4\1',r'xxx123+ is SB'))
25 #執行結果:SB123+ is xxx
26 
27 pattern=re.compile('alex')#把常用的正則表達式式存起來,以后直接用
28 print(pattern.findall('alex is alex sdjflk alexalex'))
29 #執行結果:['alex', 'alex', 'alex', 'alex']

 

                                                                                                                                                                             2018-08-18   19:20:32


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM