什么是正则表达式?
正则表达式(Regular Expression)通常被用来检索、替换那些符合某个模式(规则)的文本。
此处的Regular即是规则、规律的意思,Regular Expression即“描述某种规则的表达式”之意。
本文收集了一些常见的正则表达式用法,方便大家查询取用,并在最后附了详细的正则表达式语法手册。
案例包括:「邮箱、身份证号、手机号码、固定电话、域名、IP地址、日期、邮编、密码、中文字符、数字、字符串」
Python如何支持正则?
我用的是python来实现正则,并使用Jupyter Notebook编写代码。
Python通过re模块支持正则表达式,re 模块使 Python 语言拥有全部的正则表达式功能。
这里要注意两个函数的使用:
re.compile用于编译正则表达式,生成一个正则表达式( Pattern )对象;
.findall用于在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
# 导入re模块 import re
1.邮箱
包含大小写字母,下划线,阿拉伯数字,点号,中划线
表达式:
[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)
案例:
pattern = re.compile(r"[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)") strs = '我的私人邮箱是zhuwjwh@outlook.com,公司邮箱是123456@qq.org,麻烦登记一下?' result = pattern.findall(strs) print(result)
['zhuwjwh@outlook.com', '123456@qq.org']
2. 身份证号
xxxxxx yyyy MM dd 375 0 十八位
- 地区:[1-9]\d{5}
- 年的前两位:(18|19|([23]\d)) 1800-2399
- 年的后两位:\d{2}
- 月份:((0[1-9])|(10|11|12))
- 天数:(([0-2][1-9])|10|20|30|31) 闰年不能禁止29+
- 三位顺序码:\d{3}
- 两位顺序码:\d{2}
- 校验码:[0-9Xx]
表达式:
[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]
案例:
pattern = re.compile(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 = '小明的身份证号码是342623198910235163,手机号是13987692110' result = pattern.findall(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}
案例:
pattern = re.compile(r"1[356789]\d{9}") strs = '小明的手机号是13987692110,你明天打给他' result = pattern.findall(strs) print(result)
['13987692110']
4. 国内固定电话
区号3~4位,号码7~8位
例如:0511-1234567、021-87654321
表达式:
\d{3}-\d{8}|\d{4}-\d{7}
案例:
pattern = re.compile(r"\d{3}-\d{8}|\d{4}-\d{7}") strs = '0511-1234567是小明家的电话,他的办公室电话是021-87654321' result = pattern.findall(strs) print(result)
['0511-1234567', '021-87654321']
5. 域名
包含http:\\或https:\\
表达式:
(?:(?:http:\/\/)|(?:https:\/\/))?(?:[\w](?:[\w\-]{0,61}[\w])?\.)+[a-zA-Z]{2,6}(?:\/)
案例:
pattern = re.compile(r"(?:(?:http:\/\/)|(?:https:\/\/))?(?:[\w](?:[\w\-]{0,61}[\w])?\.)+[a-zA-Z]{2,6}(?:\/)") strs = 'Python官网的网址是https://www.python.org/' result = pattern.findall(strs) print(result)
[&