正则表达式
一、什么是正则
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个‘规则字符串’用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1.给定的字符串是否符合正则表达式的过滤逻辑称作匹配
2.可以通过正则表达式,从字符串中获取我们想要的特定部分
正则表达式的特点是:
1.灵活性,逻辑性和功能性非常的强
2.可以迅速地用极简单的方式达到字符串的复杂控制
二、正则表达式基本语法:
两个特殊的符号^和$,他们的作用是分别指出一个字符串的开始和结束。
^the :表示所有以‘the’开始的字符串
cat$ :表示所有以‘cat’结尾的字符串
^dog$ :表示开始和结尾都是‘dog’的字符串
*表示出现的重复次数,0次到多次
+表示出现的重复次数,1次到多次
?表示出现的重复次数,0次到1次
ab* :表示一个字符串有一个a后面跟着0个或多个b (a,ab,abbb.....)
ab+ :表示一个字符串有一个a后面跟着至少1个或多个b (ab,abbb,abbbb.....)
ab? :表示一个字符串有一个a后面跟着0个或者1个b(a,ab)
a?b+$ :表示在字符串的末尾有0个或一个a后面跟着一个或多个b
你也可以使用范围,用大括号括起来,用以表示重复次数的范围
ab{2} :表示一个字符串有一个a跟着2个b(abb)
ab{2,} :表示一个字符串有一个a跟着2个或多个b(abb,abbb,abbbbb......)
ab{3,5} :表示一个字符串有一个a跟着3个到5个b(abbb,abbbb,abbbbb)
还有一个|,表示‘或’的操作
hi|hello :表示一个字符串里有hi或hello
(h|cd)ef :表示bef或cdef
(a|b)*c :表示一串a或b混合的字符串后面跟着一个c
可以替代任何字符:
a.[0-9] :表示一个字符串有一个a后面跟着一个任意字符和一个数字
^.{3}$ :表示有任意三个字符的字符串
方括号表示某些字符允许在一个字符串中的某一特定位置出现:
[ab] :表示一个字符串有一个a或b,相当于a|b
[a-d] :表示一个字符串包含小写的a到中的一个,相当于a|b|c|d或者[abcd]
^[a-zA-X] :表示一个以字母开头的字符串
[0-9]% :表示一个百分号前有个一位的数字
,[a-zA-Z0-9]$ :表示一个字符串以一个逗号后面跟着一个字母或数字结束
你也可以在放括号里用^表示不希望出现的字符,^应在方括号里的第一位
%[^a-zA-Z]% :表示两个百分号中间不应该出现字母
为了逐字表达,你必须在^.$()|*+?{}\这些字符前加上转移字符\
注意:方括号中不需要转义字符
三、校验数字的表达式
1.数字:
^[0-9]*$
2.n位的数字:
^\d{n}$
3.至少n位的数字:
^\d{n,}$
4.m-n位的数字:
^\d{m,n}$
5.零或非零开头的数字:
^(0|[1-9][0-9]*)$
6.非零开头的最多带两位小数的数字:
^([1-9][0-9]*)+(.[0-9]{1,2})?$
7.带1-2位小数的正数或负数:
^(\-)?\d+(\.\d{1,2})$
8.正数、负数、和小数:
^(\-|\+)?\d+(\.\d+)?$
9.有两位小数的正实数:
^[0-9]+(\.[0-9]{2})?$
10.有1~3位小数的正实数:
^[0-9]+(\.[0-9]{1,3})?$
11.非零的正整数:
^[1-9]\d\*$ 或 ^([1-9][0-9]\*){1,3}$ 或 ^\+?[1-9][0-9]\*$
12.非零的负整数:
^\-[1-9][]0-9"\*$ 或 ^-[1-9]\d\*$
13.非负整数:
^\d+$ 或 ^[1-9]\d\*|0$
14.非正整数:
^-[1-9]\d\*|0$ 或 ^((-\d+)|(0+))$
15.非负浮点数:
^\d+(\.\d+)?$ 或 ^[1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*|0?\.0+|0$
16.非正浮点数:
^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*))|0?\.0+|0$
17.正浮点数:
^[1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*$ 或 ^(([0-9]+\.[0-9]\*[1-9][0-9]\*)|([0-9]\*[1-9][0-9]\*\.[0-9]+)|([0-9]\*[1-9][0-9]\*))$
18.负浮点数:
^-([1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*)$ 或 ^(-(([0-9]+\.[0-9]\*[1-9][0-9]\*)|([0-9]\*[1-9][0-9]\*\.[0-9]+)|([0-9]\*[1-9][0-9]\*)))$
19.浮点数:
^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*|0?\.0+|0)$
四、校验字符的表达式
1.汉字:
^[\u4e00-\u9fa5]{0,}$
2.英文和数字:
^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3.长度为3-20的所有字符:
^.{3,20}$
4.由26个英文字母组成的字符串:
^[A-Za-z]+$
5.由26个大写英文字母组成的字符串:
^[A-Z]+$
6.由26个小写英文字母组成的字符串:
^[a-z]+$
7.由数字和26个英文字母组成的字符串:
^[A-Za-z0-9]+$
8.由数字、26个英文字母或者下划线组成的字符串:
^\w+$ 或 ^\w{3,20}$
9.中文、英文、数字包括下划线:
^[\u4E00-\u9FA5A-Za-z0-9_]+$
10.中文、英文、数字但不包括下划线等符号:
^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11.禁止输入含有~的字符:
[^~\x22]+
五、特殊需求表达式
1.Email地址:
^\w+([-+.]\w+)\*@\w+([-.]\w+)\*\.\w+([-.]\w+)\*$
2.域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3.InternetURL:
[a-zA-z]+://[^\s]\* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]\*)?$
4.手机号码:
^(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}$
5.国内电话号码(0511-4405222、021-87888822):
\d{3}-\d{8}|\d{4}-\d{7}
6.电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号):
((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
7.身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:
(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
8.帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
9.密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):
^[a-zA-Z]\w{5,17}$
10.强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):
^(?=.\*\d)(?=.\*[a-z])(?=.\*[A-Z])[a-zA-Z0-9]{8,10}$
11.强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):
^(?=.\*\d)(?=.\*[a-z])(?=.\*[A-Z]).{8,10}$
12.日期格式:
^\d{4}-\d{1,2}-\d{1,2}
13.一年的12个月(01~09和1~12):
^(0?[1-9]|1[0-2])$
14.一个月的31天(01~09和1~31):
^((0?[1-9])|((1|2)[0-9])|30|31)$
15.xml文件:
^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
16.中文字符的正则表达式:
[\u4e00-\u9fa5]
17.空白行的正则表达式:
\n\s\*\r (可以用来删除空白行)
18.HTML标记的正则表达式:
<(\S\*?)[^>]\*>.\*?|<.\*? /> ( 首尾空白字符的正则表达式:^\s\*|\s\*$或(^\s\*)|(\s\*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
19.腾讯QQ号:
[1-9][0-9]{4,} (腾讯QQ号从10000开始)
20.中国邮政编码:
[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
21.IP地址:
((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
六、python re模块
import re
res="hello,maple".find("m")
# 返回的索引号,且只找第一个字母,从左到右,rfind是从右到左
print(res)
st="my name is maple"
# 匹配所以,将匹配到的元素组成列表
print(re.findall("e",st))
# 只找第一个匹配成功的,然后返回一个匹配信息的对象,对象通过group()获取字符串,没有匹配到就返回None
print(re.search("e",st).group())
# 从开头匹配,如果匹配不上,就返回None,
print(re.match("e",st))
# 按字符y分隔成2部分['m', ' name is maple']
print(re.split("[y]",st))
# 先按照y分隔,再按照l分隔['m', ' name is map', 'e']
print(re.split("[yl]",st))
# 将字符串内的所有匹配成功的字符,替换成指定字符串,可以设置替换数量
print(re.sub("m","t",st))#ty nate is taple
print(re.sub("m","t",st,2))#ty nate is maple
# 将字符串倒过来maple is name my
print(re.sub('^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?)$',r'\7\6\5\4\3\2\1',st))
# 将匹配规则封装进对象,以后利用对象可以重用该规则
obj=re.compile("m")
print(obj.search(st).group())
print(obj.findall(st))