常用正则表达式

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,我会加入一些需要注意的地方的说明&nbsp;</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/\']
\'\'\'

 

 

 

以上是关于常用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

text 正则表达式片段

markdown 正则表达式模式片段

常用的正则表达式代码汇总

JavaScript正则表达式入门

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

常用正则表达式最强汇总(含Python代码举例讲解+爬虫实战)