正则表达式

一、什么是正则

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个‘规则字符串’用来表达对字符串的一种过滤逻辑。

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

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))

posted @ 2018-10-20 17:17  Maple_feng  阅读(422)  评论(0编辑  收藏  举报