一、正则表达式
1、正则表达式(Regular Expression 或 regex 或 re):是对字符串操作的一种逻辑公式。一般使用正则表达式对字符串进行匹配和过滤。
优点:灵活,功能性强,逻辑性强。
缺点:上手难。
工具:各大文本编辑器都有正则匹配功能。在线测试工具:http://tool.chinaz.com/regex/
2、正则表达式是由普通字符和元字符组成。普通字符包含大小写字母,数字。在匹配普通字符的时候可以直接写。
(1)字符组:
字符组是用 [ ] 括起来,在 [ ] 中出现的内容会被匹配 。例如[abc] 匹配a或b或c
如果字符组中的内容过多还可以使用-,例如:[a-z]匹配a-z之间所有的字母 , [0-9]匹配所有阿拉伯数字
(2)简单的元字符
.:匹配除换行符以外的任意字符
\w:匹配字母、数字、下划线
\s:匹配任意的空白符
\d:匹配所有的数字
\n:匹配一个换行符
\t:匹配一个制表符
\b:匹配一个单词的结尾
\W:匹配非字母、数字、下划线
\S:匹配非空白字符
\D:匹配非数字
a|b:匹配a或b
( ) :匹配空号内的表达式,也表示一个组
[...]:匹配字符组中的字符
[^...]:匹配除了字符组中字符的所有字符
(3)量词:可以一次性匹配多个字符
*:重复零次或多次
+:重复一次或更多次
?:重复零次或一次
{n}:重复n次
{n,} :重复n次到更多次
{n,m}:重复n次到m次
(4)惰性匹配和贪婪匹配
惰性匹配:.+? ----->尽可能的少匹配到结果
str:张无忌喜欢周芷若. reg:张无忌.*? #此时匹配的是张无忌 str:<div>周芷若</div> reg: <.*> #结果:<div>周芷若</div> str:<div>周芷若</div> reg: <.*?> #:结果: <div> </div> str:<div>周芷若</div> reg: <(div|/div*)?> #:结果: <div> </div>
.*?x的特殊含义 找到下一个为止。
str:abcdefgxhijklmn reg:.*?x #结果:abcdefgx
贪婪匹配:* + {} ----->尽可能多的匹配到结果。
str:张无忌昨天去找周芷若了。 reg:张无忌.* 此时匹配的是整句话
(5)分组:
在正则中使用()进行分组。例如匹配15位和18位的身份证。
以下是正则: ^[1-9]\d{14}(\d{2}[0-9x])?$ ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
(6)转义
在正则表达式中,有很多特殊意义的元字符,比如\n和\s的等,如果要在正则中匹配正常的“\n”而不是“换行符”就需要对“\”进行转义,变成“\\”。在python中,无论是正则表达式还是待匹配的内容,都是一字符串的形式出现的,在字符串中"\"也有特殊的含义,本身还是需要转义。所以若果需要匹配一次"\n",字符串中就要写成"\\n",那么在正则中就要写成"\\\\n",这样就太麻烦了,这是可以用r'\n'。此时的正则式r"\\n"就可以了。
二、校验数字的表达式
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]*$
12、非零的负整数:^\-[1-9][0-9]*$ 或 ^-[1-9]\d*$
13、非负整数:^\d+$ 或 ^[1-9]\d*|0$
14、非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15、非负浮点数:^\d+(\.\d+)?$
16、非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$
17、正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
18 、负浮点数:^-([1-9]\d*\.\d|0\.\d*[1-9]\d*)$
19、浮点数:^(-?\d+)(\.\d+)?$
三、校验字符的表达式:
1、汉字:^[\u4e00-\u9fa5]{0,}$
2、英文和数字:^[0-9a-zA-Z]+$或^[0-9a-zA-Z]{4,40}$
3、长度位3-20的所有字符:^.{3,20}$
4、由26个英文字母组成的字符串:^[a-zA-Z]+$
5、由26个大写英文字母组成的字符串:^[A-Z]+$
6、由26个小写英文字母组成的字符串:^[a-z]$
7、由数字和26个英文字母组成的字符串:^[0-9a-zA-Z]+$
8、由数字、26个英文字母或者下划线组成的字符串:^\w+%或^\w{3,20}$
9、中文、英文、数字包括下划线组成的字符串:^[\u4E00-\u9FA50-9a-zA-Z_]+$
10、中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA50-9a-zA-Z]+$
11、可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
12、进制输入含有~的字符:[^~\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-Z0-9]+://[^\s]*或^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4、手机号码和座机号:1[3-9]\d{9} 或者 ^(\(\d{3,4}-)|\d{3,4}-)?\d{7,8}$ 或者(国内) \d{3}-\d{8}|\d{4}-\d{7}
5、 身份证号码(15位、18位): (^\d{15}$)|(^\d{18}|(^\d{17}(\d|X|x))$)
6、账号是否合法(字母开头,允许5-16字节,允许字母下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
7、密码(以字母开头、长度在6~18之间,只能包含字母、数字、下划线):^[a-zA-Z]\w{5,17}$
8、强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
9、 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
10、日期格式:^\d{4}-\d{1,2}-\d{1,2} 或 ^[1-9]\d{0,3}-(1[0-2]|0?[1-9])-(3[01]|[12]\d|0?[1-9])$
11、一年的12个月(01-09和1-12):^(0?[1-9]|1[0-2])$
12、一个月的31天(01-09和1-31):^((0?[1-9])|((1|2)[0-9])|30|31)$
13、钱的输入格式:
-
- 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
- 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
- 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
- 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
- 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
- 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
- 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
- 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3} (,[0-9]{3})*)(.[0-9]{1,2})?$
- 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
14、xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X]|[m|M]|[l|L]
15、中文字符的正则表达式:[\u4e00-\u9fa5]
16、双字节字符:[^\x00-\xff]
17、空白行的正则表达式:\n\s*\r
18、HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*?/> (首尾空白字符的正则表达式:^\s*|\s*$或者(^\s*)|(\s*$))
19、腾讯QQ账号:[1-9][0-9]{4,11} 或 [1-9]\d{4,11}
20、中国邮政编码:[1-9]\d{5}(?!\d)
21、IP地址:((?:(?:25[0-5]|[2-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))