Python_37正则表达式

正则表达式:本身也是一门语言

字符串的方法: find----返回的是位置   ‘abdcdd’.find('b') 返回b的位置    split-----分割字符串     replace---替换   

正则表达式是给现有方法基础上添加功能  有一定规则的功能

正则表达式的功能:

字符匹配:

普通字符匹配配: re.findall('alex','asdfwsdefalexldhhff')   得到 ['alex']从后边一个字符串中选取前一个字符串  将结果以列表的形式反馈回来
match

search

sub

split

compile
元字符匹配: .  ^ $ * + ? {} [] | () \   11个元字符

‘.’这个点是通配符 一个 . 代表一个字符    代表除了换行符以外的任何字符的匹配      re.findall('alex.d','asdfwsdefalexldhhff')   就可以匹配上   得到['aleSl']

‘^’这个是表示^后边的字符串是不是开始的字符串        re.findall('^alex','asdfwsdefalexldhhff') 返回空  匹配不出来    re.findall('^alex','alexasdfwsdefldhhff') 返回['alex']

‘$’这个是表示‘$’后边的字符串是不是末尾的字符串      re.findall('alex$','asdfwsdefalexldhhffalex')   返回   ['alex']

‘*’   ‘+’  ‘?’    ‘{ }'  做的是重复   

‘*’ 重复0到多次     re.findall('alex*','asdfwsdefalexxxldhhffalesss')  返回 ['alexxx', 'ale']    匹配的是‘*’号前边的那个字符的0到多个   re.findall('al(ex)*','asdfwsdefalexldhhffalesss') 返回  ['ex', '']   贪婪匹配  0到多次匹配,如果有多次就匹配多的

‘+’匹配重复1到多次的字符串  re.findall('alex+','asdfwsdefalexxxldhhffalesss')  返回 ['alexxx']     

‘?’匹配重复0到1次的字符串  re.findall('alex?','asdfwsdefalexxxxldhhffalesss')     返回    ['alex', 'ale']

'{}'匹配重复自定义次的字符串    re.findall('alex{3}','asdfwsdefalexxxxldhhffalesss')  返回  ['alexxx']      re.findall('alex{3,5}','asdfwsdefalexxxxxldhhffalesss')   返回    ['alexxxxx']

'[]'代表一个字符集    或  的意思    re.findall('a[bc]d','asdfwsdefalexxxxldhhffalesss')   表示是否存在  ad   abd   acd  等字符串  不能获得 abcd

通配符在字符集就表示一个字符了,就不是元字符了    re.findall('a[.]d','a.dfwsdefalexxxxldhhffalesss')

匹配一个任意小写字母 [a-z]   re.findall('[a-z]','a.dfwsdefalexxxxldhhffalesss')   返回   adfwsdefalexxxxldhhffalesss   这时候'-'就表示是通配符了,不是字符‘-’了

[^1-9]表示非1-9的数字的取出来    print ( re.findall('[^1-9]','12356576asdfwsdefalexxxxxldhhffalesss') )    返回   ['a', 's', 'd', 'f', 'w', 's', 'd', 'e', 'f', 'a', 'l', 'e', 'x', 'x', 'x', 'x', 'x', 'l', 'd', 'h', 'h', 'f', 'f', 'a', 'l', 'e', 's', 's', 's']

‘\’:反斜杠后面根元字符去除特殊功能       反斜杠后面跟普通字符实现特殊功能     引用序号对应的字组所匹配的字符串 就是能匹配出一长串,从这一长串中选取一个字组  

\d 匹配任何十进制数;它相当于类[0-9]              re.findall('\d','ws347dd67' )  返回 ['3','4','7','6','7']         re.findall('\d\d','ws347dd67')返回   ['34', '67']   

\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 匹配一个单词边界,就是指单词和空格间的位置    匹配出来的是一个单词,而不是某个单词中间夹杂的字符串

 正则表达式的匹配一般是按照贪婪原则进行的,也就是说往多了匹配,但是加了‘?’之后就会只匹配紧跟着的1个字符    最小化匹配

print ( re.findall(r"a(\d+)","a12d"))
输出————————————————————————————————————————————————
['12']
print ( re.findall(r"a(\d+?)","a12d"))
输出————————————————————————————————————————————————
['1']

如果在正则表达式后加上了截止字符,就会导致‘?’不起作用,继续贪婪匹配其实字符之间的所有字符

print ( re.findall(r"a(\d+?)d","a12d"))     findall取出来的时候是匹配的组里面的内容,就是括号里的
输出:['12']

print ( re.findall(r"a(\d+)d","a12d"))
输出:['12']
清晰的显示匹配结果:
print ( re.search(r"a(\d+)d","a12d"))
输出:<_sre.SRE_Match object; span=(0, 4), match='a12d'>
print ( re.search(r"a(\d+)d","a12d").group())
输出:a12d
print ( re.findall(r'\bhome\b','i back home you'))
输出:['home']
在用到‘\’ 前边加‘r’字符 否则用‘\\’表示转义
match

match:    re.match(pattern,string,flags=0)

pattern 是条件规则

string  是要匹配的字符串

flags 是编译标志位,默认不写标志位是0

标志位的值如下:

re.I 是对大小写不敏感

re.L 做本地化识别 (local_aware)匹配

re.M多行匹配,影响^和$

re.S使.匹配包括换行在内的所有字符

print ( re.match('.','abcd\nedf').group())
输出:['a', 'b', 'c', 'd', 'e', 'd', 'f']
print ( re.match('.','abcd\nedf',re.S).group())
输出:['a', 'b', 'c', 'd', '\n', 'e', 'd', 'f']



 

search: 格式与match一样的   re.search(pattern,string,flags=0)

match和search后边是可以跟方法的:

group() 返回被RE匹配的字符串,里边可以含参数0表示所有的组,1表示第一个组

start() 返回匹配开始的位置

end()     返回匹配结束的位置

span()  返回一个元组包含匹配的位置(开始和结束)

a='123acd345'
print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group())
输出:123acd345
a='123acd345'
print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group(1))
输出:123





 

finditer:

 

 

 

sub:替换   sub(pattern,repl,string,max=0)   旧的   新的  要操作的对象   替换所少次

print (re.sub('acd','ACD','acdefdeacderf'))
输出:ACDefdeACDerf 默认是 max处无值 替换所有
print (re.subn('acd','ACD','acdefdeacderf'))
输出:('ACDefdeACDerf', 2) 返回替换了多少次

 

split

p=re.compile('\d+')

p.split('one1tow2three3four4')

返回:['one', 'tow', 'three', 'four', '']

 

 

 

re.compile(strPattern[,flag])   先把规则编译到对象中,然后再反复的调用这个对象规则

例:regex=re.compile(r'\w*oo\w*')   以后用到这个规则可以用 regex代替   print regex.findall('asfdooddcx')\

 184

posted on 2018-03-02 16:55  JuGooLar  阅读(176)  评论(0编辑  收藏  举报

导航