正则re模块
目录
-正则
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。
re提供的方法有:
import re re.match '''从开始位置开始匹配,如果开头没有则无''' re.search '''搜索整个字符串''' re.findall '''搜索整个字符串,返回一个list'''
import re #1 print(re.findall('e','alex make love') ) #['e', 'e', 'e'],返回所有满足匹配条件的结果,放在列表里 #2 print(re.search('e','alex make love').group()) #e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 #3 print(re.match('e','alex make love')) #None,同search,不过在字符串开始处进行匹配,完全可以用search+^代替match #4 print(re.split('[ab]','abcd')) #['', '', 'cd'],先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割 #5 print('===>',re.sub('a','A','alex make love')) #===> Alex mAke love,不指定n,默认替换所有 print('===>',re.sub('a','A','alex make love',1)) #===> Alex make love print('===>',re.sub('a','A','alex make love',2)) #===> Alex mAke love print('===>',re.sub('^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?)$',r'\5\2\3\4\1','alex make love')) #===> love make alex print('===>',re.subn('a','A','alex make love')) #===> ('Alex mAke love', 2),结果带有总共替换的个数 #6 obj=re.compile('\d{2}') print(obj.search('abc123eeee').group()) #12 print(obj.findall('abc123eeee')) #['12'],重用了obj
#为何同样的表达式search与findall却有不同结果: print(re.search('\(([\+\-\*\/]*\d+\.?\d*)+\)',"1-12*(60+(-40.35/5)-(-4*3))").group()) #(-40.35/5) print(re.findall('\(([\+\-\*\/]*\d+\.?\d*)+\)',"1-12*(60+(-40.35/5)-(-4*3))")) #['/5', '*3'] #看这个例子:(\d)+相当于(\d)(\d)(\d)(\d)...,是一系列分组 print(re.search('(\d)+','123').group()) #group的作用是将所有组拼接到一起显示出来 print(re.findall('(\d)+','123')) #findall结果是组内的结果,且是最后一个组的结果
-修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。
修饰符为一个可选的标志 多个标志可以通过|来指定。如 re.L | re.M
re.search(r'[a-z]+','ajfoavnoaejgN1234ab9').group() #返回'ajfoavnoaejg' re.search(r'[a-z]+','jafjiNfhfheiHD1234a', re.I).group() #返回'jafjiNfhfheiHD' 对大小写不敏感
-常用匹配模式
模式 | 概述 |
---|---|
\w | 匹配字母数字下划线 |
\W | 匹配非字母数字下划线 |
\s | 匹配任意空白字符,<==> [\t\n\r\f] |
\S |
匹配任意非空字符 |
\d | 匹配任意数字,<==> [0-9] |
\D | 匹配任意非数字 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配什么开头 |
$ | 匹配什么结尾 |
. | 匹配任意字符(除了\n),当re.DOTALL被指定后,则包括\n |
* | 匹配0或多个表达式 |
+ | 匹配1或多个表达式 |
? | 匹配0或1个表达式,非贪婪 |
{n} | 精确匹配n个前面的表达式 |
{m,n} | 匹配m~n个前面的表达式,贪婪 |
a|b |
匹配a或b |
() | 匹配括号内的表达式,分组 |
[...] | 用来表示一组字符,单独列出,[abc]匹配'a','b','c' |
[^...] | 不在[]中的字符,[^abc]匹配除了abc的字符 |
\G | 匹配最后匹配完成的位置 |
--示例
• \w与\W print(re.findall('\w','hello weer 123')) #['h', 'e', 'l', 'l', 'o', 'w', 'e', 'e', 'r', '1', '2', '3'] print(re.findall('\W','hello weer 123')) #[' ', ' '] • \s与\S print(re.findall('\s','he\rllo\twmq\naj_12')) #['\r', '\t', '\n'] print(re.findall(r'\n','he\rllo\twmq\naj_12')) #['\n'] '''r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义''' print(re.findall('\S','he\rllo\twmq\naj_12')) #['h', 'e', 'l', 'l', 'o', 'w', 'm', 'q', 'a', 'j', '_', '1', '2'] # \n \t \r都是空,都可以被\s匹配 print(re.findall('\s','hello \n weer \t 123')) #[' ', '\n', ' ', ' ', '\t', ' '] • \d与\D print(re.findall('\d','hello weer 123')) #['1', '2', '3'] print(re.findall('\D','hello weer 123')) #['h', 'e', 'l', 'l', 'o', ' ', 'e', 'g', 'o', 'n', ' '] • ^与$ print(re.findall('^h','hello weer 123')) #['h'] print(re.findall('3$','hello weer 123')) #['3'] • . print(re.findall('a.b','a1b')) #['a1b'] print(re.findall('a.b','a1b a*b a b aaab')) #['a1b', 'a*b', 'a b', 'aab'] print(re.findall('a.b','a\nb')) #[] print(re.findall('a.b','a\nb',re.S)) #['a\nb'] print(re.findall('a.b','a\nb',re.DOTALL)) #['a\nb']同上一条意思一样 • * print(re.findall('ab*','bbbbbbb')) #[] print(re.findall('ab*','a')) #['a'] print(re.findall('ab*','abbbb')) #['abbbb'] • ? print(re.findall('ab?','a')) #['a'] print(re.findall('ab?','abbb')) #['ab'] • .*默认为贪婪匹配 print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b'] print(re.findall('a.*','a1b22222222b')) #['a1b22222222b'] • .*?为非贪婪匹配:推荐使用 print(re.findall('a.*?b','a1b22222222b')) #['a1b'] • + print(re.findall('ab+','a')) #[] print(re.findall('ab+','abbb')) #['abbb'] • {m,n} print(re.findall('ab{2}','abbb')) #['abb'] print(re.findall('ab{2,4}','abbb')) #['abb'] print(re.findall('ab{1,}','abbb')) #'ab{1,}' ==> 'ab+' print(re.findall('ab{0,}','abbb')) #'ab{0,}' ==> 'ab*' • [ ] print(re.findall('a[1*-]b','a1b a*b a-b')) #[]内的都为普通字符 且如果-没有被转意的话,应该放到[]的开头或结尾 print(re.findall('a[^1*-]b','a1b a*b a-b a=b')) #[]内的^是取反,所以结果为['a=b'] print(re.findall('a[a-zA-Z]b','a1b a*b a-b a=b aeb aEb')) • () 分组 print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab'] print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab print(re.findall('(?:ab)+123','ababab123')) #findall的结果不是匹配的全部内容,而是组内的内容, ?:可以让结果为匹配的全部内容 print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击</a>')) #['http://www.baidu.com'] print(re.findall('href="(?:.*?)"','<a href="http://www.baidu.com">点击</a>'))# ['href="http://www.baidu.com"'] print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company')) #['companies', 'company']
-一些正则匹配表达式
Email地址: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 手机号码: ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ 身份证号(15位、18位数字): ^\d{15}|\d{18}$ 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线): ^[a-zA-Z]\w{5,17}$ 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间): ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ xml文件: ^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$ 腾讯QQ号: [1-9][0-9]{4,} (腾讯QQ号从10000开始) 中国邮政编码: [1-9]\d{5}(?!\d) (中国邮政编码为6位数字) IP地址.1: \d+\.\d+\.\d+\.\d+ (提取IP地址时有用) IP地址.2: ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))