re模块

 

  关于re模块的介绍我们主要学习其元字符的用法、以及其模块下的几种方法(重点有findall/search/macth/split等,当然还有/sub/subn/finditer/compile等)等

  定义:就本质而言,re(正则表达式)是一种小型的、高度专业化的编程语言,它内嵌在Python语言中,主要用于字符串的模糊匹配。

一、元字符

  通常字符的匹配,有两种方式:

   普通字符:大多数字符和字母都会和自身匹配,这种可以称为精准匹配。例如:

>>> import re
>>> re.findall("amanda","helloamandaworld") #普通字符匹配
["amanda"]

   元字符:可以规定满足一定的条件下即可对字符串进行匹配,这种可以称为模糊匹配。其有以下几种元字符:

               

  而每种方法的用途如下:

  示例:

import re
#. -->通配符,除\n以外的任意字符
>>> re.findall("a.","amanda")
['am', 'an'] #返回的是a以及a以后的一位
>>> re.findall("a..","amanda")
['ama'] #返回的是a以及a以后的两位

#^ -->从字符串开头开始匹配
>>> re.findall("^a.","amanda")
['am']

#$ -->从字符串末尾开始匹配
>>> re.findall("a..x$","helloalex")
['alex']

#* -->该字符重复匹配0或者0次以上
>>> re.findall("alex*","helloalexxxx")
['alexxxx']

#+ -->该字符重复匹配1或者1次以上
>>> re.findall("alex+","helloalexxxx")
['alexxxx']

#* 与 + 的区别:两者均为贪婪匹配
>>> re.findall("alex+","helloale")
[]
>>> re.findall("alex*","helloale")
['ale']

#? -->该字符串匹配0次或者1次
>>> re.findall("alex?","helloalexxxx")
['alex']

#{} -->可指定该元素重复匹配多少次或者之间
>>> re.findall("alex{1,3}","helloalexxx")
['alexxx'] #x重复匹配1-3次

#注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配,例如:
>>> re.findall("alex+","helloalexxx")
['alexxx'] #贪婪匹配
>>> re.findall("alex+?","helloalexxx")
['alex']  #惰性匹配


#----------------------------------------------------------------------------------
#[] -->字符集,字符集内无特殊字符(^ - \除外),字符集内元素为或的意思
>>> re.findall("a[bcl]lx","helloablx") #匹配字符集内某个元素
['ablx']
>>> re.findall("a[*+%]ex","helloa*ex")
['a*ex']

#1、字符集内特殊字符----  -
>>> re.findall("a[a-z]ex","helloalexx")
['alex']

#2、字符集内特殊字符----  ^ ,非
>>> re.findall("[^ab]","abcdadc")
['c', 'd', 'd', 'c'] 
>>> re.findall("\([^()]*\)","12+8*(5*(3+2)+12)")
['(3+2)']  #匹配运算的最先运算的值

#3、字符集内特殊字符---   \,转义符
>>> re.findall("[\d]","hello123")
['1', '2', '3']
>>> re.findall("\d+","alex33little-five22amanda23")
['33', '22', '23']

#----------------------------------------------------------------------------------
#元字符之分组------ ()
>>> re.findall("(alex)?","alexalex")
['alex', 'alex', '']
>>> re.findall("alex+","alexxx")
['alexxx']

#----------------------------------------------------------------------
#元字符之管道符  -----    |(或)
>>> re.findall("ab|ac|ad","adhelloac")
['ad', 'ac']
>>> re.findall("av|\d","avhello123")
['av', '1', '2', '3']

  元字符之转义符 ----    \

  \ -->转义符,反斜杠后边跟元字符去除特殊功能,比如  \.  。

        反斜杠后边跟普通字符实现特殊功能,比如  \d  。

\d  匹配任何十进制数;它相当于类 [0-9]。

\D 匹配任何非数字字符;它相当于类 [^0-9]。

\s  匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。

\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。

\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。

\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]

\b  匹配一个特殊字符边界,比如空格 ,&,#等

  例如:

# \d -- 匹配任何十进制数;它相当于类 [0-9]。
>>> re.findall("\d+","amanda23little-five22alex33")
['23', '22', '33']

#\D 匹配任何非数字字符;它相当于类 [^0-9]。
>>> re.findall("\D+","amanda23little-five22alex33")
['amanda', 'little-five', 'alex']

#\s  匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
>>> re.findall("\s+","hello\n\t world")
['\n\t ']

#\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
>>> re.findall("\S+","hello\n\t world")
['hello', 'world']

#\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
>>> re.findall("\w+","alex$hello%world")
['alex', 'hello', 'world']

#\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
>>> re.findall("\W+","alex$hello%world")
['$', '%']

#\b  匹配一个特殊字符边界,比如空格 ,&,#等
>>> re.findall(r"I\b","I am little-five")
['I']

#-------------------------------------------------------------------
#关于被匹配字符串中存在转义符
>>> re.findall("\\\\d","little\dfive")
['\\d']

#注其原理如下图:

 

二、re模块下的方法

  re模块下的方法有 search、findall、match、split、sub、subn、compile、finditer等方法。

>>> import re

#1、findall()---> #返回所有满足匹配条件的结果,放在列表里
>>> re.findall("\D+","amanda23little-five22")
['amanda', 'little-five']

#2、search() -->#函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,
#该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
>>> re.search("\D+","amanda23little-five22")
<_sre.SRE_Match object; span=(0, 6), match='amanda'>
>>> res.group()
'amanda'

#3、split--->先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
>>> re.split("[ac]","abcd")
['', 'b', 'd']

#4、match -->从头开始匹配,返回一个包含匹配信息的对象
>>> re.match("h.{4}","helloworld")
<_sre.SRE_Match object; span=(0, 5), match='hello'>

#5、sub -->匹配替换
>>> re.sub("\d","-","little5five")
'little-five'
>>> re.subn("\d","-","little5five xiao5wu",0)
('little-five xiao-wu', 2) #返回替换结果和替换次数

#6、类似findall,但是返回是对象
>>>res=re.finditer("\D","little5five xiao5wu")
<callable_iterator object at 0x0000021D84E89198>
>>> ret=next(res)
<_sre.SRE_Match object; span=(0, 1), match='l'>
>>> ret=next(res)
>>> ret.group()
'l'

  取消优先级:

import re
 
ret=re.findall('www.(baidu|sina).com','www.oldboy.com')
print(ret)#['sina]     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
 
ret=re.findall('www.(?:baidu|sina).com','www.oldboy.com')
print(ret)#['www.sina.com']

 

posted @ 2018-06-24 23:33  Little_five  阅读(244)  评论(0编辑  收藏  举报