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