我这篇是转载的,因此有很多都没有验证是否正确,就当是参考一下。然后我为了排版好看,有很多 ^ 后面加了一个空格,复制时要注意 ^ 后面是否有空格符,这个是多余的。
1.正则表达式汇总表
先上一张大家都很熟悉的图:
2.常用正则表达式
一、校验数字的表达式:
正则表达式含义 | 正则表达式 |
---|---|
数字 | ^ [0-9]*$ |
n位的数字 | ^\d{n}$ |
至少n位的数字 | ^\d{n,}$ |
m-n位的数字 | ^\d{m,n}$ |
零和非零开头的数字 | ^(0|[1-9][0-9]*)$ |
非零开头的最多带两位小数的数字 | ^([1-9][0-9]*)+(.[0-9]{1,2})?$ |
带1-2位小数的正数或负数 | ^(-)?\d+(.\d{1,2})?$ |
正数、负数、和小数 | ^(-|+)?\d+(.\d+)?$ |
有两位小数的正实数 | ^ [0-9]+(.[0-9]{2})?$ |
有1~3位小数的正实数 | ^ [0-9]+(.[0-9]{1,3})?$ |
非零的正整数 | ^ [1-9]\d*$ |
非零的负整数 | ^-[1-9]\d*$ |
非负整数 | ^ [1-9]\d*|0$ |
非正整数 | ^-[1-9]\d*|0$ |
非负浮点数 | ^\d+(.\d+)?$ 或 ^ [1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$ |
非正浮点数 | ^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$ |
正浮点数 | ^ [1-9]\d*.\d*|0.\d*[1-9]\d*$ |
负浮点数 | ^-[1-9]\d*.\d*|-0.\d*[1-9]\d*$ |
二、校验字符的表达式:
正则表达式含义 | 正则表达式 |
---|---|
汉字 | ^ [\u4e00-\u9fa5]{0,}$ |
英文和数字 | ^ [A-Za-z0-9]+$ 或 ^ [A-Za-z0-9]{4,40}$ |
长度为3-20的所有字符 | ^.{3,20}$ |
由26个英文字母组成的字符串 | ^ [A-Za-z]+$ |
由26个大写英文字母组成的字符串 | ^ [A-Z]+$ |
由26个小写英文字母组成的字符串 | ^ [a-z]+$ |
由数字和26个英文字母组成的字符串 | ^ [A-Za-z0-9]+$ |
由数字、26个英文字母或者下划线组成的字符串 | ^\w+$ 或 ^\w{3,20}$ |
中文、英文、数字包括下划线 | ^ [\u4E00-\u9FA5A-Za-z0-9_]+$ |
中文、英文、数字但不包括下划线等符号 | ^ [\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^ [\u4E00-\u9FA5A-Za-z0-9]{2,20}$ |
可以输入含有^%&’,;=?$"等字符 | [^%&’,;=?$\x22]+ |
禁止输入含有~的字符 | [^~\x22]+ |
三、特殊需求表达式:
正则表达式含义 | 正则表达式 |
---|---|
Email地址 | ^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$ |
域名 | [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? |
电话号码(“XXX-XXXXXXX”、“XXXX-XXXXXXXX”、“XXX-XXXXXXX”、“XXX-XXXXXXXX”、"XXXXXXX"和"XXXXXXXX) | ^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$ |
国内电话号码(0511-4405222、021-87888822) | \d{3}-\d{8}|\d{4}-\d{7} |
身份证号(18位数字) | ^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$ |
帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线) | ^ [a-zA-Z][a-zA-Z0-9_]{4,15}$ |
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线) | ^ [a-zA-Z]\w{5,17}$ |
强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间) | ^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$ |
日期格式 | ^\d{4}-\d{1,2}-\d{1,2} |
一年的12个月(01~09和1~12) | ^(0?[1-9]|1[0-2])$ |
一个月的31天(01~09和1~31) | ^((0?[1-9])|((1|2)[0-9])|30|31)$ |
xml文件 | ^([a-zA-Z]±?)+[a-zA-Z0-9]+\.[x |
中文字符的正则表达式 | [\u4e00-\u9fa5] |
双字节字符 | [^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)) |
空白行的正则表达式 | \n\s*\r (可以用来删除空白行) |
首尾空白字符的正则表达式 | ^\s*|\s*$ 或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式) |
腾讯QQ号 | [1-9][0-9]{4,} (腾讯QQ号从10000开始) |
中国邮政编码 | [1-9]\d{5}(?!\d) (中国邮政编码为6位数字) |
IP地址 | \d+.\d+.\d+.\d+ (提取IP地址时有用) |
3.万能法则
3.1 贪婪与非贪婪匹配
如:str="ab123c"
p1="ab.*?c"
p2="ab(.*?)c"
贪婪匹配:
正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p1匹配字符串str,结果就是匹配到:ab123c。
非贪婪匹配:
就是匹配到结果就好,就少的匹配字符。如上面使用模式p2匹配字符串str,结果就是匹配到:123。
注意:在实践中,正则没必要一口就吞个胖子,可以降阶匹配,少费点脑力,后面结合BeautifulSoup,就更简单啦。
3.2 多行匹配
re.S:.将会匹配换行符,默认.不会匹配换行符。(Python Cookbook的方法OUT啦)
>>> re.findall("a(\d+)b.+a(\d+)b", "a23b\na34b")
[]
>>> re.findall("a(\d+)b.+a(\d+)b", "a23b\na34b", re.S)
[('23', '34')]
>>> re.findall("^a(\d+)b", "a23b\na34b")
['23']
>>> re.findall("^a(\d+)b", "a23b\na34b", re.M)
['23', '34']
>>> re.findall("a(\d+)b", "a23b\na23b")
['23', '23']