常用正则表达式

  正则表达式设计之初就是为了匹配任何特征的字符串,所以也就有了无数种可能的模式。但毕竟不是每一种我们

都会用到,总有一些正则表达式是比较常用的,并且占了应用的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 id="cnblogs_post_body">
  <p style="margin-left: 30px">正则表达式设计之初就是为了匹配任何特征的字符串,所以也就有了无数种可能的模式。但毕竟不是每一种我们</p>   <p style="margin-left: 30px">,以备不时之需。代码示例使用python,我会加入一些需要注意的地方的说明&nbsp;</p>
</div>
""" # 匹配标签整体 print re.findall('<[^>]+/?>', _string) # 输出 ''' ['<div id="cnblogs_post_body">', '<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/']
'''

 

 

 

posted @ 2016-11-22 10:50  Mr..D  阅读(1293)  评论(1编辑  收藏  举报