正则表达式常用示例

Posted z-qinfeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式常用示例相关的知识,希望对你有一定的参考价值。

import re

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

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

"""

 

 

"""
.   :匹配任意一个字符,
除外
[]  :匹配[]中列举的字符
d  : 数字,即0~9
D  : 非数字
s  : 空白字符,包括空格, 
 , 	 ,
, 回车换行
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(wW,g1)
"""

边界问题

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

"""

 

 

"""

匹配数量:

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


"""

 

"""

边界问题

^ : 匹配字符串开头
$ : 匹配结尾
 : 匹配单词边界
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:od是单词边界
r = re.match(r^w+od,good)
print(r) # <re.Match object; span=(0, 4), match=‘good‘>

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

r = re.match(r^w+od,good)
print(r) #None

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

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


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

r = re.match(r^w+odB,good)
print(r) #None

 

"""
分组:


|      : 表示左右任意一个表达式
(ab)   :  将括号中的字符作为一个分组

um   : 引用分组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会记录()中的内容,我们可以使用
um来引用
    在上面的示例中, 第一次出现的(.+) 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, 132@163.com)
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‘)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

正则表达式常用示例

常用正则表达式

Shell脚本------正则表达式与常用命令(sort,uniq,tr,cut)

JavaScript中 正则表达式的使用 及 常用正则表达式

正则表达式全解析+常用示例

scala和正则表达式常用基础知识示例