正则

正则表达式(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'))

 

posted @ 2019-03-03 15:50  王苗鲁  阅读(1084)  评论(0编辑  收藏  举报