正则
正则表达式(re模块)
一:什么是正则?
正则就是用一系列具有特殊含义的符号,组合到一起(称之为正则表达式)来描述字符或者字符串的方法。或者说正则就是用来描述一类事物的规则。
(在Python中) 它内嵌在Python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。
生活中处处是正则:
比如我们描述:4条腿
你可能会想到的是四条腿的动物或者桌子,椅子等
继续描述:4条腿,活的,就剩动物这一类了。
二:常用匹配模式(元字符)
http://blog.csdn.net/yufenghyc/article/details/51078107
匹配模式
1.正则匹配
import re print(re.findall('\w','ab 12\+- *&_')) #匹配字母数字及下划线 ['a', 'b', '1', '2', '_'] # \w print(re.findall('\W','ab 12\+- *&_')) #匹配非字母数字下划线 [' ', '\\', '+', '-', ' ', '*', '&'] print(re.findall('\s','ab \r1\n2\t\+- *&_')) #匹配任意空白字符,等价于[\t\n\r\f] [' ', '\r', '\n', '\t', ' '] print(re.findall('\S','ab \r1\n2\t\+- *&_')) #匹配任意非空字符 ['a', 'b', '1', '2', '\\', '+', '-', '*', '&', '_'] print(re.findall('\d','ab \r1\n2\t\+- *&_')) #匹配任意数字,等价于[0-9] ['1', '2'] # \d print(re.findall('\D','ab \r1\n2\t\+- *&_')) #匹配任意非数字 ['a', 'b', ' ', '\r', '\n', '\t', '\\', '+', '-', ' ', '*', '&', '_'] print(re.findall('\w_sb','egon alex_sb123123wxx_sb,lxx_sb')) ['x_sb', 'x_sb', 'x_sb'] # \w_sb print(re.findall('\Aalex','abcalex is salexb')) #匹配字符串开始 [] \A以后不会用 print(re.findall('\Aalex','alex is salexb')) #匹配字符串开始 ['alex'] \A以后不会用 print(re.findall('^alex','alex is salexb')) #匹配字符串的开头 ['alex'] 一般用^ print(re.findall('sb\Z','alexsb is sbalexbsb')) #匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 ['sb'] \Z以后不会用 print(re.findall('sb$','alexsb is sbalexbsb')) #匹配字符串的末尾 ['sb'] 一般用$ # sb print(re.findall('^ebn$','ebn1')) #正着找是他,倒着找也是他 [] # ebn print(re.findall('a\nc','a\nc a\tc a1c'))#匹配一个换行符 ['a\nc']
2.重复匹配
import re # . ? * + {m,n} .* .*? # 1、.:代表除了换行符外的任意一个字符 print(re.findall('a.c','abc a1c aAc aaaaaca\nc')) #['abc', 'a1c', 'aAc', 'aac'] # a.c print(re.findall('a.c','abc a1c aAc aaaaaca\nc',re.DOTALL)) #re.DOTALL 有了这个以后.也能匹配换行符 #['abc', 'a1c', 'aAc', 'aac', 'a\nc'] # 2、?:代表左边那一个字符重复0次或1次 print(re.findall('ab?','a ab abb abbb abbbb abbbb')) #['a', 'ab', 'ab', 'ab', 'ab', 'ab'] # ab? # 3、*:代表左边那一个字符出现0次或无穷次 print(re.findall('ab*','a ab abb abbb abbbb abbbb a1bbbbbbb')) #['a', 'ab', 'abb', 'abbb', 'abbbb', 'abbbb', 'a'] # ab* # 4、+ :代表左边那一个字符出现1次或无穷次 print(re.findall('ab+','a ab abb abbb abbbb abbbb a1bbbbbbb')) #['ab', 'abb', 'abbb', 'abbbb', 'abbbb'] # ab+ # 5、{m,n}:代表左边那一个字符出现m次到n次 #自己指定左边的符号出现几次 print(re.findall('ab?','a ab abb abbb abbbb abbbb')) #['a', 'ab', 'ab', 'ab', 'ab', 'ab'] print(re.findall('ab{0,1}','a ab abb abbb abbbb abbbb')) #['a', 'ab', 'ab', 'ab', 'ab', 'ab'] print(re.findall('ab*','a ab abb abbb abbbb abbbb a1bbbbbbb')) #['a', 'ab', 'ab', 'ab', 'ab', 'ab'] print(re.findall('ab{0,}','a ab abb abbb abbbb abbbb a1bbbbbbb')) #['a', 'ab', 'ab', 'ab', 'ab', 'ab'] print(re.findall('ab+','a ab abb abbb abbbb abbbb a1bbbbbbb')) #['ab', 'abb', 'abbb', 'abbbb', 'abbbb'] print(re.findall('ab{1,}','a ab abb abbb abbbb abbbb a1bbbbbbb')) #['ab', 'abb', 'abbb', 'abbbb', 'abbbb'] print(re.findall('ab{1,3}','a ab abb abbb abbbb abbbb a1bbbbbbb')) #['ab', 'abb', 'abbb', 'abbb', 'abbb']
3. .*:匹配任意长度,任意的字符=====》贪婪匹配 #指的是从没有到什么都有
import re
print(re.findall('a.*c','ac a123c aaaac a *123)()c asdfasfdsadf')) #['ac a123c aaaac a *123)()c'] # a.*c
4. .*?:非贪婪匹配(爬虫里面用的最多的方式)
import re
print(re.findall('a.*?c','a123c456c')) #['a123c']
():分组 # 括号的作用:匹配上了只留括号里的东西(在爬虫里面经常用)
import re print(re.findall('(alex)_sb','alex_sb asdfsafdafdaalex_sb')) #只留括号内的,括号不影响匹配 ['alex', 'alex'] # (alex)_sb print(re.findall( 'href="(.*?)"', #只要网址加() '<li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li>') ) #['http://www.cnblogs.com/'] # 括号的作用:匹配上了只留括号里的东西(在爬虫里面经常用) # <li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li> # href=".*?" #碰到一个双引号停 # []:匹配一个指定范围内的字符(这一个字符来自于括号内定义的) #匹配11 print(re.findall('a[0-9][0-9]c','a1c a+c a2c a9c a11c a-c acc aAc')) #['a11c'] #当-需要被当中普通符号匹配时,只能放到[]的最左边或最 右边 #匹配两个字符 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'] # []内的^代表取反的意思 不是a-z或者A-Z 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'] print(re.findall('a[^0-9]c','a c a1c a+c a2c a9c a*c a11c a-c acc aAc')) #['a c', 'a+c', 'a*c', 'a-c', 'acc', 'aAc'] print(re.findall('([a-z]+)_sb','egon alex_sb123123wxxxxxxxxxxxxx_sb,lxx_sb')) #['alex', 'wxxxxxxxxxxxxx', 'lxx'] # [a-z]+_sb
| :或者的意思
import re print(re.findall('compan(ies|y)','Too many companies have gone bankrupt, and the next one is my company')) #['ies', 'y'] # (?:):代表取匹配成功的所有内容,而不仅仅只是括号内的内容 print(re.findall('compan(?:ies|y)','Too many companies have gone bankrupt, and the next one is my company')) #['companies', 'company'] print(re.findall('alex|sb','alex sb sadfsadfasdfegon alex sb egon')) #['alex', 'sb', 'alex', 'sb']
re模块的其他方法:
import re print(re.findall('alex|sb','123123 alex sb sadfsadfasdfegon alex sb egon')) #findall直接把结果拿到放到列表里面 print(re.search('alex|sb','123213 alex sb sadfsadfasdfegon alex sb egon').group()) #.group()只拿匹配成功的第一个 print(re.search('^alex','123213 alex sb sadfsadfasdfegon alex sb egon')) #search快速判断一个字符串中是否存在字符串 print(re.search('^alex','alex sb sadfsadfasdfegon alex sb egon').group()) print(re.match('alex','alex sb sadfsadfasdfegon alex sb egon').group()) #match相当于上肩号版本的search print(re.match('alex','123213 alex sb sadfsadfasdfegon alex sb egon')) info='a:b:c:d' print(info.split(':')) #['a', 'b', 'c', 'd'] print(re.split(':',info)) #['a', 'b', 'c', 'd'] info=r'get :a.txt\3333/rwx' #r加在前面表示字符串里面没有特殊意义 print(re.split('[ :\\\/]',info))#\代表转译后面那个符号 ['get', '', 'a.txt', '3333', 'rwx'] print('egon is beutifull egon'.replace('egon','EGON',1)) #EGON is beutifull egon print(re.sub('(.*?)(egon)(.*?)(egon)(.*?)',r'\1\2\3EGON\5','123 egon is beutifull egon 123')) # (123 )(egon)( is beutifull )(egon)( 123) #\1\2\3EGON\5 print(re.sub('(lqz)(.*?)(SB)',r'\3\2\1',r'lqz is SB'))#需求者两单词换过来 lqz和SB 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'lqzzzz123+ is SB')) #(lqzzzz)(123+ )(is)( )(SB) pattern=re.compile('alex') print(pattern.findall('alex is alex alex')) print(pattern.findall('alexasdfsadfsadfasdfasdfasfd is alex alex'))