python通过re模块实现正则的。
我们掌握findall()的用法就可以了,其他几个不常用。
findall():匹配所有的字符串,把匹配结果作为一个列表返回
match():匹配字符串的开始位置,如果开始位置没有就返回NOne
search():在字符串搜索,返回搜索到的第一个
finditer():匹配所有字符串,返回迭代器
findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
- 。:匹配任意字符(除\n以外)
- []:匹配[]中的任意一个字符
- \d: 匹配数字
- \D: 匹配非数字
- \s(小写):匹配空白
- \S(大写):匹配非空白
- \w(小写):匹配非特殊字符(字符,数字,汉字,_)
- \W(大写):匹配特殊字符(-、@#¥)
- *:匹配前一个字符出现0次,或者无限次(贪婪模式)
- +:匹配前一个字符出现1次或者无限次[贪婪模式]【1----无限次】
- ?:匹配前一个字符出现0次,或者1次(非贪婪模式)
- {n}:匹配前一个字符连续出现n次
- {n,m}:匹配前一个字符连续出现n-m次
逻辑运算
|:两个条件进行匹配,或的关系
边界值
^:匹配字符串开始的位置
$:匹配字符串结束的位置
分组匹配
():只匹配括号里面的
- 整数:^-?\d+$
-
- 英文字符串:^[A-Za-z]+$
-
- E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
-
-
- URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
- URL:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$
-
- 邮政编码:^[1-9]\d{5}$
-
- 中文:^[\u0391-\uFFE5]+$
-
- 电话号码:^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$
-
- 手机号码:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$
- 提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
- 提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
- 提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
- 提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
- 提取信息中的中国手机号码:(86)*0*13\d{9}
- 提取信息中的任何数字 :(-?\d*)(\.\d+)?
- IP:(\d+)\.(\d+)\.(\d+)\.(\d+)
- 电话区号:/^0\d{2,3}$/
- 腾讯QQ号:^[1-9]*[1-9][0-9]*$
- 帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$
- 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
- sql语句:^(select|drop|delete|create|update|insert).*$
- 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
1.邮箱
包含大小写字母,下划线,阿拉伯数字,点号,中划线
表达式:
[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)
案例:
- import re
- strs = '我的私人邮箱是zhuwjwh@outlook.com,公司邮箱是123456@qq.org,麻烦登记一下?'
- result = re.findall(r"[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)",strs)
- print(result)
输出:
['zhuwjwh@outlook.com', '123456@qq.org']
2. 身份证号
xxxxxx yyyy MM dd 375 0 十八位
表达式:
[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]
案例:
- import re
- strs = '小明的身份证号码是342623198910235163,手机号是13987692110'
- result = re.findall(r"[1-9]\d{5}(?:18|19|(?:[23]\d))\d{2}(?:(?:0[1-9])|(?:10|11|12))(?:(?:[0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]",strs)
- print(result)
输出:
['342623198910235163']
3、国内手机号码
手机号都为11位,且以1开头,第二位一般为3、5、6、7、8、9 ,剩下九位任意数字
例如:13987692110、15610098778
表达式:
1(3|4|5|6|7|8|9)\d{9}
案例:
- import re
- strs = '小明的手机号是13987692110,你明天打给他'
- result = re.findall(r"1[356789]\d{9}",strs)
- print(result)
- ['13987692110']
4、账号:
包括中文、字母、数字下划线的组合
- import re
- result_name1 = "张三、lisi\wan 望族99qq;我ai1__heihei;张三_a11"
- name_2 = re.findall('[\u4e00-\u9fa5_a-zA-Z0-9]+', result_name1)
- print(name_2)
- ['张三', 'lisi', 'wan', '望族99qq', '我ai1__heihei', '张三_a11']
包括中文、字母、数字组合,不包含下划线
- import re
- result_name1 = "张三、lisi\wan 望族99qq;我ai1__heihei;张三_a11"
- name_2 = re.findall('[\u4e00-\u9fa5a-zA-Z0-9]+', result_name1)
- print(name_2)
- ['张三', 'lisi', 'wan', '望族99qq', '我ai1', 'heihei', '张三', 'a11']
5、简易身份证号
前17是数字,第18位是数字或者x或者X
- import re
- strs = '小明的身份证号码是342623198910235163,手机号是13987692110'
- name_2 = re.findall("[0-9]{17}[0-9Xx]", strs)
- print(name_2)
- ['342623198910235163']