常用正则表达式
Posted Mr.D
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式设计之初就是为了匹配任何特征的字符串,所以也就有了无数种可能的模式。但毕竟不是每一种我们
都会用到,总有一些正则表达式是比较常用的,并且占了应用的80%,下面我们就来总结一下这些常用的正则表达式
,以备不时之需。代码示例使用python,我会加入一些需要注意的地方的说明
1.匹配中文
uincode编码中中文的编码范围为 4e00-9fa5,正则表达式可据此来定义
# 目标字符串 注意转换为 Unicode 编码 _string = u"大家好,欢迎来到python正则表达式教程" # 正则表达式也要用 Unicode words = re.findall(u"[\\u4e00-\\u9f5a]+", _string) for word in words: print word # 输出 \'\'\' 大家好 欢迎来到 正则表达式教程 \'\'\'
2.匹配空行
这个一般用来去除文件中的空行,空行分3种,首行,末行,中间行,代码示例将使用正则去除这三种空行
# 目标字符串 _string = """ 大家好 欢迎来到 正则表达式教程 """ # 定义一个匹配换行符的正则表达式 # 先匹配 \\r\\n 再匹配 \\n line_reg = \'[(?:\\r\\n)|\\n]\' # 首行空行匹配正则 需替换为 \'\' first_line_reg = \'^\' + line_reg # 末行空行匹配正则 需替换为 \'\' last_line_reg = line_reg + \'$\' # 匹配中间行 # 两个换行之间为空白字符 需替换为换行 以 unix 换行 \\n 为例 # [(?:\\r\\n)|\\n]\\s*[(?:\\r\\n)|\\n] other_line_reg = line_reg + \'\\s*\' + line_reg # 开始替换 #_string = re.sub(first_line_reg, \'\', _string) #_string = re.sub(last_line_reg, \'\', _string) #_string = re.sub(other_line_reg, \'\\n\', _string) # 最简单的方式 利用字符串的strip方法去除首尾空白字符 然后去掉中间空行_string = re.sub(other_line_reg, \'\\n\', _string.strip()) print _string # 输出 \'\'\' 大家好 欢迎来到 正则表达式教程 \'\'\'
3.匹配html标签
利用HTML标签的特征,以<>包括
# 目标字符串 _string = """<div >
<p style="margin-left: 30px">正则表达式设计之初就是为了匹配任何特征的字符串,所以也就有了无数种可能的模式。但毕竟不是每一种我们</p> <p style="margin-left: 30px">,以备不时之需。代码示例使用python,我会加入一些需要注意的地方的说明 </p>
</div>""" # 匹配标签整体 print re.findall(\'<[^>]+/?>\', _string) # 输出 \'\'\' [\'<div >\', \'<p style="margin-left: 30px">\', \'</p>\', \'<p style="margin-left: 30px">\', \'</p>\', \'</div>\'] \'\'\'
4.中国身份证号码18位
# 目标字符串 _string = \'371311199501011081\' # _string = \'37131119950151108x\' # 身份证号特征 # 前六位行政区划分代码 纯数字 不以0开头 # 中间8位出生年月日 暂定为2100年之前 # 15-17位为顺序码 纯数字 # 18位为校验码 数字+x print re.findall(\'[1-9]\\d{5}[1-2]\\d{4}[0-2][0-3]\\d{4}[\\d|x|X]\', _string) # 输出 \'\'\' [\'371311199501011081\']
5.邮箱
# 目标字符串 _string = \'myemail.qq@qq.com\' # 不同的邮箱的限制规则略微有区别 这里就写一个比较通用的 print re.findall(\'^[\\w\\.]{3,}@[a-zA-Z0-9]+\\.[a-z]{2,4}$\', _string) # 输出 \'\'\' [\'myemail.qq@qq.com\'] \'\'\'
6.手机号码和电话号码
# 目标字符串 _string = \'\'\'+8613743451234 13578921356 0371-8562889 010-52722222 \'\'\' # 特殊的号码,例如 110、10086、95119等这些号码最好还是使用穷举法来匹配# 一般手机号 包含+86 print re.findall(\'(?:\\+86)?1\\d{10}\', _string) # 一般固话号码 print re.findall(\'(?:\\d{3}-\\d{8}|\\d{4}-\\d{7})\', _string) # 输出 \'\'\' [\'+8613743451234\', \'13578921356\'] [\'0371-8562889\', \'010-52722366\'] \'\'\'
7.URL
# 目标字符串 _string = \'\'\' https://www.ail.org:800/doku.php?id=Main?DASF https://www.youtube.com/watch?v=QmTxf http://fanyi.baidu.com/#auto/zh/ http://www.ehaoyao.com/product-37753.html?baidu \'\'\' # url格式 包含 http https ftp file 以及其他 # [a-zA-Z]+:\\/\\/ # 域名格式 包含 xxx.xxx.com 192.168.1.1等 # (?:[-\\w]+\\.)+[\\w]+\\/? # 路径以及参数 /a/b.html?a=1&b=2#123 # [-\\/\\w\\?#&=\\.]+ print re.findall(\'[a-zA-Z]+://(?:[-\\w]+\\.)+\\w+(?::\\d+)?/?(?:[-/\\w\\.]*)?\\??(?:[-\\w+\\.#&=/]*)?\', _string) # 输出 \'\'\' [\'https://www.ail.org:800/doku.php?id=Main\', \'https://www.youtube.com/watch?v=QmTxf\', \'http://fanyi.baidu.com/#auto/zh/\', \'http://www.ehaoyao.com/product-37753.html?baidu\'] \'\'\'
8.IP地址
# 目标字符串 _string = \'\'\' 192.168.11.11 \'\'\' # 0-255 分为4段 # 3位数 # 2开头 1开头 # 2[0-5]\\d # 1\\d{2} # 2位数 # [1-9]\\d # 1位数 # \\d # 一段数字 # (?:2[0-5]\\d|1\\d{2}|[1-9]\\d|\\d) # 加 . # (?:(?:2[0-5]\\d|1\\d{2}|[1-9]\\d|\\d)\\.) # 全 # (?:(?:2[0-5]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(?:2[0-5]\\d|1\\d{2}|[1-9]\\d|\\d) print re.findall(\'(?:(?:2[0-5]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(?:2[0-5]\\d|1\\d{2}|[1-9]\\d|\\d)\', _string)[0] # 输出 \'\'\' 192.168.11.11 \'\'\'
9.日期格式
日期格式太多了,这里仅写一下常见的格式
# 目标字符串 _string = u\'\'\' 2016/11/21 15:39:21 2016-11-21 15:39:21 2016年11月21日 15:39:21 \'\'\' print re.findall(u\'\\d{4}[-/\\u4e00-\\u9f5a]\\d{2}[-/\\u4e00-\\u9f5a]\\d{2}[-/\\u4e00-\\u9f5a]?\\s+\\d+:\\d+:\\d+\', _string) # 输出 \'\'\' [u\'2016/11/21 15:39:21\', u\'2016-11-21 15:39:21\', u\'2016\\u5e7411\\u670821\\u65e5 15:39:21\'] \'\'\'
10.密码强度限制
# 目标字符串 _string = \'\'\' daf3147vmfkADSF\'\'\' # 匹配思路 # 存在一个位置 后面任意个字符存在数字 小写字母 大写字母 # 长度限制 print re.findall(\'(?=.*?\\d)(?=.*?[a-z])(?=.*?[A-Z]).{8,16}\', _string) # 输出 \'\'\' [\'daf3147vmfkADSF\'] \'\'\'
11.金额
# 目标字符串 _string = \'\'\' 999.01 99,999,999.01 \'\'\' # print re.findall(\'\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?\', _string) # 输出 \'\'\' [\'999.01\', \'99,999,999.01\'] \'\'\'
12.从网页中提取图片链接和超链接
# 目标字符串 _string = \'\'\' <li><a id="blog_nav_rss" href="http://www.cnblogs.com/dyfblog/rss">订阅</a><a id="blog_nav_rss_image" href="http://www.cnblogs.com/dyfblog/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a> <li><a id="blog_nav_admin" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li> </ul> \'\'\' # print re.findall(\'<img[^>]*?src=[\\\'\\"]([^\\\'\\"]+)\', _string) print re.findall(\'<a[^>]*?href=[\\\'\\"]([^\\\'\\"]+)\', _string) # 输出 \'\'\' [\'//www.cnblogs.com/images/xml.gif\'] [\'http://www.cnblogs.com/dyfblog/rss\', \'http://www.cnblogs.com/dyfblog/rss\', \'https://i.cnblogs.com/\'] \'\'\'
以上是关于常用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章