正则表达式常用示例

Darklovy 2019-12-06

import re

"""
   使用match方法进行匹配
   result = re.match(正则表达式,要匹配的字符串)
   如果match匹配到数据的话,就可以使用group方法提取数据

   注: 若字符串匹配正则表达式,则match方法返回匹配对象(Match Object), 否则返回None(不是空字符串)
       match方法是从左到右匹配(因为match的这种特性,所以 ^ 从字符串头开始匹配 可以不用写),匹配到不一样的地方,match方法就结束!

"""
"""
.   :匹配任意一个字符,\n除外
[]  :匹配[]中列举的字符
\d  : 数字,即0~9
\D  : 非数字
\s  : 空白字符,包括空格, \n , \t ,\r, 回车换行
\S  :非空白字符
\w  :单词,(可以看成是校验python变量名,实际两者没有任何关系,a~z , A~Z, 0~9 , _ )
\W  : 非单词字符
"""
In [1]: import re

In [2]: re.match(‘admin‘,‘good.admin‘)

In [3]: re.match(‘.+‘,‘good.admin‘)
Out[3]: <re.Match object; span=(0, 10), match=‘good.admin‘>

In [4]: re.match(‘.‘,‘good.admin‘)
Out[4]: <re.Match object; span=(0, 1), match=‘g‘>

In [5]: re.match(‘..‘,‘good.admin‘)
Out[5]: <re.Match object; span=(0, 2), match=‘go‘>

In [6]: re.match(‘.*‘,‘good.admin‘)
Out[6]: <re.Match object; span=(0, 10), match=‘good.admin‘>
In [7]: re.match(‘\w‘,‘good‘)
Out[7]: <re.Match object; span=(0, 1), match=‘g‘>

In [8]: re.match(‘\w‘,‘g1‘)
Out[8]: <re.Match object; span=(0, 1), match=‘g‘>

In [9]: re.match(‘\W‘,‘g1‘)
# \w与g匹配,但是\W与1不相匹配,所以最终还是不匹配,返回None
In [10]: re.match(‘\w\W‘,‘g1‘)
"""

边界问题

^ : 匹配字符串开头
$ : 匹配结尾
\b : 匹配单词边界
\B : 匹配非单词边界

"""
"""

匹配数量:

    *   : 匹配一个字符出现0次或者无限多次
    +   :匹配一个字符出现1次或者无限多次
    ?  :匹配一个字符出现0次或者1次
    {m} : 匹配一个字符出现m次
    {m,}: 匹配一个字符至少出现m次
    {m,n} : 匹配一个字符出现m到n次


"""
"""

边界问题

^ : 匹配字符串开头
$ : 匹配结尾
\b : 匹配单词边界
\B : 匹配非单词边界

"""
‘‘‘
示例2:匹配手机号
‘‘‘

r = re.match(‘1[35689]\d{9}$‘,‘13218545678‘)
print(r)  # <re.Match object; span=(0, 11), match=‘13218545678‘>

r = re.match(‘1[35689]\d{9}$‘,‘132185456789‘)
print(r)  #None

r = re.match(‘1[35689]\d{9}‘,‘132185456789‘)  # 没有$符,无边界问题
print(r)  #<re.Match object; span=(0, 11), match=‘13218545678‘>

r = re.match(‘1[35689]\d{9}‘,‘13218545aaaa6789‘)
print(r)  #None
‘‘‘
示例3: 匹配单词边界

‘‘‘

# r:去掉转义;  ^:字符串开头, od\b:od是单词边界
r = re.match(r‘^\w+od\b‘,‘good‘)
print(r) # <re.Match object; span=(0, 4), match=‘good‘>

r = re.match(r‘^\w+od\b‘,‘gooder‘)
print(r) #None

r = re.match(r‘^\w+\bod\b‘,‘good‘)
print(r) #None

r = re.match(r‘^\w+\bod\b‘,‘jd od‘)
print(r) #None, 因为\b只表示单词边界,并不表示空格

r = re.match(r‘^\w+\s\bod\b‘,‘jd od‘)  # 这里用\s去匹配了jd与od之间的空白字符
print(r) #<re.Match object; span=(0, 5), match=‘jd od‘>


r = re.match(r‘^\w+od\B‘,‘gooder‘)
print(r) #<re.Match object; span=(0, 4), match=‘good‘>

r = re.match(r‘^\w+od\B‘,‘good‘)
print(r) #None
"""
分组:


|      : 表示左右任意一个表达式
(ab)   :  将括号中的字符作为一个分组
\num   : 引用分组num匹配到的字符串
(?P<name>) : 分组起别名
(?P=name)  : 引用别名为name分组匹配到的字符串

"""
‘‘‘示例4 匹配0-100之间的数字‘‘‘

r = re.match(r‘[1-9]\d?$|0$|100$‘,‘100‘ )
print(r) #<re.Match object; span=(0, 3), match=‘100‘>

# 改进版
r = re.match(r‘[1-9]?\d?$|100$‘,‘0‘ )
print(r) #<re.Match object; span=(0, 1), match=‘0‘>
‘‘‘
示例5: 从字符串中抽取特定的字符 , 如抽取h1标签之间的字符
‘‘‘

s = ‘<h1>我是中国人</h1>‘

r = re.match(r"<h1>(.*)</h1>",s)
print(r.group())  #<h1>我是中国人</h1>
print(r.group(1))  # 我是中国人    , 1 : 表过正则表达式分组第1次出现

s = ‘<h1>打倒小日本</h1>‘
r = re.match(r"<h1>(.*)</h1>",s)
print(r.group())  #<h1>打倒小日本</h1>
print(r.group(1))  # 打倒小日本    , 1 : 表过正则表达式分组第1次出现

s = ‘<h1>打倒小日本 我是中国人</h1>‘
r = re.match(r"<h1>(\D*)\s(\D*)</h1>",s)
print(r.group())  #<h1>打倒小日本 我是中国人</h1>
print(r.group(1))  # 打倒小日本  取第1个分组的值
print(r.group(2))  # 我是中国人  取第2个分组的值
print(r.groups())  # 将所有的分组结果以一个元组的形式打印出来
‘‘‘
示例6: 匹配<html><h1>zhengqinfeng</h1></html>,且,首尾尖括号中的内容相同、内层尖括号中的内容相同
‘‘‘

s = ‘<html><h1>zhengqinfeng</h1></html>‘

r = re.match(r‘<.+><.+>.+</.+></.+>‘,s)
print(r)  #<re.Match object; span=(0, 34), match=‘<html><h1>zhengqinfeng</h1></html>‘>

# 上面的正则貌似完成了需要,实则不然, 它并不满足"且"后面的要求,所以正确的正则如下

r= re.match(r‘<(.+)><(.+)>.+</\2></\1>‘,s)  # 记录前面加r,不会会转义
print(r) #<re.Match object; span=(0, 34), match=‘<html><h1>zhengqinfeng</h1></html>‘>

s = ‘<html><h1>zhengqinfeng</h2></html>‘
r= re.match(r‘<(.+)><(.+)>.+</\2></\1>‘,s)  # 记录前面加r,不会会转义
print(r) #None

"""
    使用()时,re会记录()中的内容,我们可以使用\num来引用
    在上面的示例中, 第一次出现的(.+) re会记录为num =1 ; 第二次出现的 (.+) re会记录为num =2
    在后面使用时,可以直接\1, \2来引用值

"""

由例5,例6两示例可知,正则分组用途如下:

1. 从字符串提取出特定的字符2. 动态引用分组内容进行匹配
‘‘‘
示例7: 抽取邮箱账号

        (163|126|135|qq|gmail)  :表示匹配其中一种
        \.  : 匹配邮箱中的.
        (com|cn|net) : 表示匹配邮箱后缀中的一种
        $ : 表结束 ,也就是说邮箱是以com,cn,或者是net结尾

‘‘‘

p = r‘(\w+)@(163|126|135|qq|gmail)\.(com|cn|net)$‘

r = re.match(p, ‘‘)
print(r)
print(r.groups())
print(r.group(1))  # 提取邮箱账号  132
‘‘‘
示例8: 正则分组取名字

‘‘‘

s = ‘<html><h1>zhengqinfeng</h1></html>‘
r =  re.match(‘<(?P<key1>.+)><(?P<key2>.+)>.+</(?P=key2)></(?P=key1)>‘,s)
print(r)  # <re.Match object; span=(0, 34), match=‘<html><h1>zhengqinfeng</h1></html>‘>
print(r.groups())  # (‘html‘, ‘h1‘)

相关推荐