re正则表达式模块

每个+号可展开,每个加号展开后中去掉''' '''注释后可运行

#正则的组成:
#原子,元字符,模式修正符【其他语言中可能存在定界符】

#基础知识
'''
#原子
# 组成正则表达式的最小单位,一个正则表达式至少需要一个原子
# 1所有可见字符都是原子:a,b,c,d...A,B,C,D...你,我,他...+-*/##@
# 2所有不可见字符也是原子:\t    \n  \r ...
# 3正则专用转义字符:
# \d   表示0~9之间任意【一个】字符   ->[0123456789]自定义原子列表格式
# \D   表示除了0~9之外的任意【一个】字符  ->[^0123456789]自定义排除列表
# \s	 表示任意【一个】空白字符(不可见)        \t \n都算   -> [\n\r\t\v\f]自定义原子列表格式
# \S	 表示任意【一个】非空白字符(可见字符)    ->[^ \n\r\t\v\f]自定义排除列表
# \w   表示0~9 a~z A~Z和_中的任意【一个】字符     ->[a-zA-Z0-9_]自定义原子列表格式
# \W	 表示除了0~9 a~z A~Z之外的任意【一个】字符   ->[^a-zA-Z0-9_]自定义排除列表
# .	 表示任意一个字符【除了\n】

#正则表达式本质是字符串,单独使用没有意义,正则表达式需要配合相关的函数和方法

#re模块:正则表达式专用模块,提供正则相关的操作方法
'''

#search方法
'''
import re
#search:查找符号正则表达式的第一个内容

#准备正则表达式
pattern = r'baidu'#python 中要使用r模式的字符串表示

#正则查找的字符串
url = 'http://www/baidu.com'

#匹配操作
result = re.search(pattern,url)
#search(pattern: Pattern[AnyStr]【字符串】,string: AnyStr【要查找的字符串】,flags: Union[int, RegexFlag] = ...) -> Optional[Match[AnyStr]]
print(result)
#<_sre.SRE_Match object; span=(11, 16), match='baidu'>
'''

#原子测试
'''    
#准备正则表达式
pattern = r'\d'

#正则查找的字符串
url = 'http://www/bai1du.c9om'

#匹配操作
result = re.search(pattern,url)
#search(pattern: Pattern[AnyStr]【字符串】,string: AnyStr【要查找的字符串】,flags: Union[int, RegexFlag] = ...) -> Optional[Match[AnyStr]]
print(result)
#<_sre.SRE_Match object; span=(14, 15), match='1'>   只能匹配到第一个内容
'''

# 元字符(一):【原子修饰符】
'''
    #需要0-9奇数组成的原子1,3,5,7,9

    #1  []自定义原子列表
        #表示自定义原子列表中的任意一个字符,如果多个字符在asscii码中连续,可以进行缩写,例如[0123456789] 可改写成-> [0-9]
    #2  [^]自定义排除列表
        #表示原子列表之外的任意一个字符,如果多个字符在asscii码中连续,可以进行缩写,例如[0123456789] 可改写成-> [0-9]
    #3  与数量相关的元字符
        #以下只修饰前面的一个原子
        # +  表示一个以上的修饰原子 [1~正无穷]  ->   {1,}
        # ? 表示0个或1个修饰的原子 [0或者1]   ->   {0,1}
        # *  表示任意个修饰的原子  [0~正无穷]  ->   {0,}
        # {m}   表示必须是m个修饰原子
        # {m,n} 表示修饰的原子数量是m到n之间的数量(包含m也包含n)
        # {m,}  表示修饰的原子是m个到正无穷(包含m)
        # {,n}  表示0-n个修饰的原子(包含0页包含n)

import re
#准备正则表达式
pattern1 = r'[13579]'#1或者3或者5或者7或者9
pattern2 = r'[^0123456789]'
pattern3 = r'go?gle'#问号?修饰o
pattern4 = r'go+gle'
pattern5 = r'go*gle'
pattern6 = r'go{3,}gle'

#正则查找的字符串
url1 = 'dfbv2dv1fdfv4'
url2 = 'asd123'
url3 = 'www.gogle.com'
url4 = 'www.goooooooogle.com'
url5 = 'www.ggle.com'
url6 = 'www.goooooooogle.com'
#匹配操作
result1 = re.search(pattern1,url1)
print(result1)
    #<_sre.SRE_Match object; span=(7, 8), match='1'>
result2 = re.search(pattern2,url2)
print(result2)
    #<_sre.SRE_Match object; span=(0, 1), match='a'>
result3 = re.search(pattern3,url3)
print(result3)
    #<_sre.SRE_Match object; span=(0, 1), match='a'>
result4 = re.search(pattern4,url4)
print(result4)
    #<_sre.SRE_Match object; span=(4, 16), match='goooooooogle'>
result5 = re.search(pattern5,url5)
print(result5)
    #<_sre.SRE_Match object; span=(4, 8), match='ggle'>
result6 = re.search(pattern6,url6)
print(result6)
'''

# 元字符(二)
'''
    #1 \A  表示限定内容必须在整个字符串的开头部位
    #2 \Z  表示限定内容必须在整个字符串的结束部位
    #3 ^   相当于\A,并且支持多行匹配模式,记得在后面加上:'re.M'-模式修正符号
    #4 $   相当于\Z,并且支持多行匹配模式
    #额外补充:多行模式:如果字符串中包含\n,则可以在匹配时使用多行匹配模式,多行匹配模式
        # 就是将每一行当做独立的字符串进行匹配。
        # 注意:多行模式需要使用模式修正符

    #5 \b   表示能够当做英文单词分割的字符,(除了字母和数字,都是词边界 汉子作为字母处理)
    #6 \B   表示不能够当做英文单词分割的字符,(非词边界,就是字母和数字)代表一个字符
    #7 |    表示选择关系,左右的内容二选一   非常重要,是运算规则
    #8 ()   1.改变正则表达式中的优先级关系
    #       2.将多个原子视为一个原子处理,方便使用元字符,【可以叫做组 或者模式单元】
    #       3.将匹配的内容当做模式单元进行存储
 
import re

#准备正表达式
pattern1 = r'\Ahttp'
pattern2 = r'm\Z'
pattern3 = r'^http'
pattern4 = r'\bmy'  #\b的作用是my前必须是可以作为分隔符号的东西
pattern5 = r'\bmy\b'   #my必须是个单词才能被匹配
pattern6 = r'\bmy'
pattern7 = r'\bmy\B' #my的左边是词边界,my的右边不能是词边界
pattern8 = r'ab|cd' #ab或者cd
pattern9 = r'a(b|c)d'  #acd或者abd
pattern10 = r'(go)+gle'


#正则查找的字符串
url1 = 'http://www.google.com'
url2 = 'http://www.google.coma'
url3 = '谷歌的地址是\nhttp://www.google.coma'
url4 = 'if you lose myself'  #如果是if you lose123myself,则输出none
url5 = 'if you lose my self'
url6 = 'if you lose myself,if you feel my love'
url7 = 'if you lose myself,if you feel my love'
url8 = '我喜欢的字母是abcd'
url9 = '我喜欢的字母是acd'
url10 = 'http://www.gogogogle.com'


#匹配操作
result1 = re.search(pattern1,url1)
print(result1)
    #<_sre.SRE_Match object; span=(0, 4), match='http'>
result2 = re.search(pattern2,url2)
print(result2)
    #None
result3 = re.search(pattern3,url3,re.M)#'re.M'-模式修正符号
print(result3)
    #<_sre.SRE_Match object; span=(7, 11), match='http'>
result4 = re.search(pattern4,url4)
print(result4)
    #<_sre.SRE_Match object; span=(12, 14), match='my'>
result5 = re.search(pattern5,url5)
print(result5)
    #<_sre.SRE_Match object; span=(12, 14), match='my'>
result6 = re.findall(pattern6,url6)                 #findall是多次匹配
print(result6)
    #['my', 'my']
result7 = re.findall(pattern7,url7) #findall是多次匹配
print(result7)
    #['my']
result8 = re.search(pattern8,url8) #findall是多次匹配
print(result8)
    #<_sre.SRE_Match object; span=(7, 9), match='ab'>
result9 = re.search(pattern9,url9) #findall是多次匹配
print(result9)
    #<_sre.SRE_Match object; span=(7, 10), match='acd'>
result10 = re.search(pattern10,url10) #findall是多次匹配
print(result10)
    #<_sre.SRE_Match object; span=(11, 20), match='gogogogle'>'''

#模式修正符
'''
    #设定匹配的一些额外的规则。
    # re.A  或者re.ASCII    在ASCII模式下进行正则匹配操作  ASCII码只有数字字母下划线
    # re.U  或者re.UNICODE  在UNICODE模式下进行正则匹配操作  默认情况下
    # re.S  使得原子.可以匹配任意字符,包含\n
    # re.M  或者re.MULTILINE  匹配操作在多行模式下进行  都是与^和$相关
#以下暂缺
    # re.X  或者re.VERBOSE  匹配的时候忽略正则表达式中的空格或者注释
    # re.I  或者re.IGNORECASE 匹配过程中忽略大大小写

import re
#准备正则表达式
pattern1 = r'\w+'  #w是字母数字下划线
pattern2 = r'\w+'

pattern3 = r'e.b'
pattern4 = r'e.b'

pattern5 = r'^www'


#正则查找的字符串
url1 = '我love你他love我我也love大家'
url2 = '我love你他love我我也love大家'
url3 = 'google\nbaidu'
url4 = 'google\nbaidu'

url5 = 'www.baidu.com\nwww.google.com'


#匹配条件
result1 = re.search(pattern1,url1,re.U)
print(result1)
    #<_sre.SRE_Match object; span=(0, 20), match='我love你他love我我也love大家'>
result2 = re.findall(pattern2,url2,re.A)
print(result2)
    #['love', 'love', 'love']

result3 = re.findall(pattern3,url3,re.A)
print(result3)
    #[]    因为.可以匹配除了\n以外的任意字符(基础知识)
result4 = re.findall(pattern4,url4,re.S)
print(result4)
    #['e\nb']

result5 = re.findall(pattern5,url5,re.MULTILINE)
print(result5)
    #['www', 'www']
'''

#转义字符的应用
'''
    #字符串:\n  \r  \t  \\ ...
    #因为在正则的元字符和原子当中,使用了部分的符号作为语法,为了匹配这些符号的单纯字符格式,在正则表达式中添加\即可去掉意义,获取字符

#导入re模块
import re

#正则表达式
pattern1 = r'www.baidu.com'  #.可以代替任何字符,除了\n
pattern2 = r'www\.baidu\.com'  #去掉.在正则表达式中的功能
pattern3 = r'[百度]'  #[]的作用是在“百”中“度”任选其一
pattern4 = r'\[百度\]'  #去掉[]在正则表达式中的功能

#字符串
str1 = 'http://www1baidu1com'
str2 = 'http://www.baidu.com' #如果改成http://www1baidu1com就匹配不到了
str3 = 'www.baidu.com[百度]'
str4 = 'www.baidu.com[百度]'

#进行匹配操作
result1 = re.search(pattern1,str1)
print(result1)
    #<_sre.SRE_Match object; span=(0, 13), match='www1baidu1com'>
result2 = re.search(pattern2,str2)
print(result2)
    #<_sre.SRE_Match object; span=(7, 20), match='www.baidu.com'>
result3 = re.search(pattern3,str3)
print(result3)
    #<_sre.SRE_Match object; span=(14, 15), match='百'>
result4 = re.search(pattern4,str4)
print(result4)
    #<_sre.SRE_Match object; span=(13, 17), match='[百度]'>
'''

#扩展之后正则语法
'''
    # 1 (?Limsux)   多种模式修正符的应用    L不常用
    # 2 (?:)        取消单元存储功能   节省资源
    # 3 (?P<name>)  自定义模式单元的名称
    # 4 (?P=name)   获取自定义模式单元的内容
    # 5 (?#)        正则注释内容,解析器不会处理该内容(用的不多)
    # 6 (?=)        正向先行断言  (零宽断言)   有的话就匹配,没有就不匹配
            #正向 -> 有     负向 -> 相当于没有
            #先行 -> 向前/向右进行查找      后行 ->向后/向左进行查找
    # 7 (?!)        负向先行断言  (零宽断言)
            #正向 -> 有     负向 -> 相当于没有
            #先行 -> 向前/向右进行查找      后行 ->向后/向左进行查找
    # 8 (?<=)       正向后行断言(零宽断言)
            # 正向 -> 有     负向 -> 相当于没有
            # 先行 -> 向前/向右进行查找      后行 ->向后/向左进行查找
    # 9 (?<!)       负向后行断言(零宽断言)
            # 正向 -> 有     负向 -> 相当于没有
            # 先行 -> 向前/向右进行查找      后行 ->向后/向左进行查找
        #零宽断言注意事项
        #1.可以同时存在前行和后行
        #2.后行注意事项,宽度必须指定,不能是可变宽度
    # 10 (?(id/name)Y|N)    根据模式单元是否存在决定使用Y的规则(模式单元存在)或者是N的规则

#导入re模块
import re

#正则表达式
    #1 (?Limsux)  多种模式修正符的应用    L不常用
pattern1 = r'baidu'
pattern2 = r'(?imx)bai   du'    #i是不区分大小写,x是去除正则的空白
    #2 (?:)      取消单元存储功能
pattern3 = r'bai(du)'  #将()中的内容作为模式单元处理(这是自带的功能)
pattern4 = r'(bai)(du)'
pattern5 = r'bai(?:du)+'  #“?:”取消了()单元存储功能
    # 3 (?P<name>)  自定义模式单元的名称
pattern6 = r'<([a-z]+)>.*</\1>'     #\1是想取出整个模式单元中第一个内容
                                    #索引模式单元的应用
pattern7 = r'<(?P<biaoti>[a-z]+)>.*'
    # 4 (?P=name)   获取自定义模式单元的内容
pattern8 = r'<(?P<biaoti>[a-z]+)>.*</(?P=biaoti)>' #字典模式单元的存储
    # 5 (?#)        正则注释内容
pattern9 = r'(?i)bai(?#我就是个注释)du'
    # 6 (?=)        正向先行断言  (零宽断言)
pattern10 = r'lmonkey(?=\.com)'     #lmonkey后有没有.com,有的话就匹配,没有的话就不匹配
    # 7 (?!)        负向先行断言  (零宽断言)
pattern11 = r'lmonkey(?!\.com)'     #lmonkey后没有.com的都要
pattern12 = r'lmonkey\d(?!\.com)'
    # 8 (?<=)       正向后行断言(零宽断言)
pattern13 = r'(?<=xxyd\.)lmonkey\d'    #前面有xxyd的才要
    # 9 (?<!)       负向后行断言(零宽断言)
pattern14 = r'(?<!xxyd\.)lmonkey\d'     #前面没有xxyd的才要
    # 10 (?(id/name)Y|N)    根据模式单元是否存在决定使用Y的规则(模式单元存在)或者是N的规则
    #www.lmonkey.com
pattern15 = r'(www)?(?(1).*|\w+\.)'    #如果www存在,就把整个网址拿出来
pattern16 = r'(www)?(?(1).*|\w+\.)'    #用(1)来引用第一个模式单元

#字符串
    #1 (?Limsux)  多种模式修正符的应用    L不常用
str1 = 'www.BaiDu.com[百度]'
str2 = 'www.BaiDu.com[百度]'
    #2 (?:)      取消单元存储功能
str3 = 'www.baidu.com'
str4 = 'www.baidu.com'
str5 = 'www.baidudududududu.com'
    # 3 (?P<name>)  自定义模式单元的名称
str6 = '<title>百度</title><body>www.baidu.com</body>'
str7 = '<title>百度</title><body>www.baidu.com</body>'
    # 4 (?P=name)  获取自定义模式单元的内容
str8 = '<title>百度</title><body>www.baidu.com</body>'
    # 5 (?#)        正则注释内容
str9 = 'www.baidu.com'
    # 6 (?=)        正向先行断言  (零宽断言)
str10 = 'www.lmonkey.cn-www.lmonkey.com-www.lmonkey.net-www.lmonkey.org'
    # 7 (?!)        负向先行断言  (零宽断言)
str11 = 'www.lmonkey.cn-www.lmonkey.com-www.lmonkey.net-www.lmonkey.org'
str12 = 'www.lmonkey1.cn-www.lmonkey2.com-www.lmonkey3.net-www.lmonkey4.org'
    # 8 (?<=)       正向后行断言(零宽断言)
str13 = 'www.lmonkey1.cn-bbs.lmonkey2.com-xxyd.lmonkey3.net-aaa.lmonkey4.org'
    # 9 (?<!)       负向后行断言(零宽断言)
str14 = 'www.lmonkey1.cn-bbs.lmonkey2.com-xxyd.lmonkey3.net-aaa.lmonkey4.org'
    # 10 (?(id/name)Y|N)    根据模式单元是否存在决定使用Y的规则(模式单元存在)或者是N的规则
str15 = 'www.lmonkey.com'
str16 = 'bbs.lmonkey.com'


#进行匹配操作
    #1 (?Limsux)  多种模式修正符的应用    L不常用
result1 = re.search(pattern1,str1,re.I)
print(result1)#<_sre.SRE_Match object; span=(4, 9), match='BaiDu'>
result2 = re.search(pattern2,str2)
print(result2)#<_sre.SRE_Match object; span=(4, 9), match='BaiDu'>
    #2 (?:)      取消单元存储功能
result3 = re.search(pattern3,str3)
print(result3)
print(result3.groups())#<_sre.SRE_Match object; span=(4, 9), match='baidu'>
                        #('du',)
result4 = re.search(pattern4,str4)
print(result4.groups())#('bai', 'du')
result5 = re.search(pattern5,str5)
print(result5)
print(result5.groups())#<_sre.SRE_Match object; span=(4, 19), match='baidudududududu'>
                        #()
    # 3 (?P<name>)  自定义模式单元的名称
result6 = re.search(pattern6,str6)
print(result6)
print(result6.groups())#<_sre.SRE_Match object; span=(0, 17), match='<title>百度</title>'>
                        #('title',)
result7 = re.search(pattern7,str7)
print(result7)
print(result7.groupdict())    #<_sre.SRE_Match object; span=(0, 43), match='<title>百度</title><body>www.baidu.com</body>'>
                              #{'biaoti': 'title'}
    # 4 (?P=name)  获取自定义模式单元的内容
result8 = re.search(pattern8,str8)
print(result8)
print(result8.groupdict())      #<_sre.SRE_Match object; span=(0, 17), match='<title>百度</title>'>
                                #{'biaoti': 'title'}
    # 5 (?#)        正则注释内容
result9 = re.search(pattern9,str9)
print(result9)                  #<_sre.SRE_Match object; span=(4, 9), match='baidu'>
    # 6 (?=)        正向先行断言  (零宽断言)
result10 = re.search(pattern10,str10)
print(result10)                 #<_sre.SRE_Match object; span=(19, 26), match='lmonkey'>
    # 7 (?!)        负向先行断言  (零宽断言)
result11 = re.search(pattern11,str11)
print(result11)                 #<_sre.SRE_Match object; span=(4, 11), match='lmonkey'>
result12 = re.findall(pattern12,str12)
print(result12)                 #['lmonkey1', 'lmonkey3', 'lmonkey4']
    # 8 (?<=)       正向后行断言(零宽断言)
result13 = re.search(pattern13,str13)
print(result13)                 #<_sre.SRE_Match object; span=(38, 46), match='lmonkey3'>
    # 9 (?<!)       负向后行断言(零宽断言)
result14 = re.findall(pattern14,str14)
print(result14)                 #['lmonkey1', 'lmonkey2', 'lmonkey4']
    # 10 (?(id/name)Y|N)    根据模式单元是否存在决定使用Y的规则(模式单元存在)或者是N的规则
result15 = re.search(pattern15,str15)
print(result15)                 #<_sre.SRE_Match object; span=(0, 15), match='www.lmonkey.com'>
result16 = re.search(pattern16,str16)
print(result16)                 #<_sre.SRE_Match object; span=(0, 4), match='bbs.'>
'''

#正则表达式的书写
'''
#1.用户名(简单的正则)
    #a.设定规则(有字符,必须3个字符以上,可以使用数字,不能使用特殊符号,可以使用_)
    #b.书写以下符合规则的实例
        #congha
        #congha666
        #cong_ha
        #cong_666
    #c.正则书写
    #d.验证正则(正确/错误)
#2.ip地址
    #a.设定规则(四个数字段,每个数字段用.分割,数字范围0~255)
    #b.书写以下符合规则的实例
        #192.168.0.1
        #127.0.0.1
        #0.0.0.0
        #255.255.255.255
    #c.正则书写
    #d.验证正则(正确/错误)
#3.电话号码
    #a.设定规则(纯数字:11位数字,第2,3个号码有限制)
    #b.书写以下符合规则的实例
        # 13012345678
        # 13112345678
        # ...
        # 13912345678

        # 147...

        # 15112345678
        # ...
        # 15912345678

        # 170...
        # ...
        # 179...

        # 180...
        # ...
        # 189...
    #c.正则书写
    #d.验证正则(正确/错误)
#4.身份证
    # a.设定规则(18位内容,数字和字母X组成,X只能在最后一位,部分内容需要年月日的需求)
    # b.书写以下符合规则的实例
        #110345(地址) 19991224(出生日期) 123(顺序码) 9(校验码)
        #120234 20000509 123 x
    # c.正则书写
    # d.验证正则(正确/错误)

import re
#正则表达式
    #1.用户名
pattern1 = r'^\w{3,}$'     #
pattern2 = r'^\w{3,}$'
    #2.ip地址
#pattern3 = r'\d(?#1位数)|\d[1-9]\d(?#2位数) | 1\d{2}(?#3位数100-199) | 2[0-4]\d (?#3位数200-249) | 25[0-5] \.'
#pattern3 = r'^((?:\d)|(?:[1-9]\d)|(?:1\d{2})|(?:2[0-4]\d)|(?:25[0-5]))\.$'
pattern3 = r'^((?:[1-9]?|1\d|2[0-4]\d)|(?:25[0-5]))\.$'     #简化合并 ”提取公因式“
pattern4 = r'^(((?:([1-9]?|1\d|2[0-4])\d)|(?:25[0-5]))\.){3}((?:([1-9]?|1\d|2[0-4])\d)|(?:25[0-5]))$'
    #3.电话号码
#pattern5 = r'130|131|147|15\d|17\d|18\d\d{8}'
pattern5 = r'1(47|[3578]\d) \d{8}'   # 合并   这里有个空格,可以在re.search中用re.X去掉空格
    #4.身份证
pattern6 = r'\d{6}  (18|19|[2-9]\d)\d{2}  (0[1-9]|1[0-2])  (0[1-9]|[12]\d|3[01])  \d{3}(\d|x)'


#检测字符串
    # 1.用户名
str1 = 'congha'
str2 = 'ch'   #错误的用户名
    #2.ip地址
str3 = '00.'
str3_1 = '199.'
str4 = '192.168.0.1'
    # 3.电话号码
str5 = '17012345678'
    #4.身份证
str6 = '11034519930502123x'



#匹配操作
    # 1.用户名
result1 = re.search(pattern1,str1)
print(result1)      #<_sre.SRE_Match object; span=(0, 6), match='congha'>
result2 = re.search(pattern2,str2)
print(result2)      #None
    #2.ip地址
result3 = re.search(pattern3,str3)
print(result3)      #None
result3_1 = re.search(pattern3,str3_1)
print(result3_1)    #<_sre.SRE_Match object; span=(0, 4), match='199.'>
result4 = re.search(pattern4,str4)
print(result4)      #<_sre.SRE_Match object; span=(0, 11), match='192.168.0.1'>
    # 3.电话号码
result5 = re.search(pattern5,str5,re.X)
print(result5)      #<_sre.SRE_Match object; span=(0, 11), match='17012345678'>
    #4.身份证
result6 = re.search(pattern6,str6,re.X)
print(result6)      #<_sre.SRE_Match object; span=(0, 18), match='11034519930502123x'>
print(result6.groups())
'''

#re模块:正则表达式的专用模块,提供正则相关的操作方法
'''
#re模块的方法
    #complie()   1.编译正则表达式,获取正则表达式对象   2.可以循环利用,提高程序效率
            #格式:re.compile(正则字符串,模式修正符)
            #返回值:正则对象
    #escape()   对字符串进行转义处理(仅处理非数字和字母的字符串)
            #格式:re.escape(字符串)
            #结果:字符串
    #findall()  对字符串进行正则匹配,获取所有匹配的内容结果
            #格式:re.findall(正则表达式,匹配字符串,模式修正符)
            #结果:列表
    #finditer() 对字符串进行正则匹配,获取所有匹配的结果对象
            # 格式:re.finditer(正则表达式,匹配字符串,模式修正符)
            # 结果:包含所有匹配结果的迭代器
    #match()    对字符串的开头对字符串进行正则匹配,当匹配到第一个结果时就停止匹配,返回结果对象
            #格式:re.match(正则表达式,匹配的字符串,模式修正符)
            #结果:匹配结果对象
    #search()   是在任意位置对字符串进行正则匹配,当匹配到第一个结果时就停止匹配,返回结果对象
            # 格式:re.match(正则表达式,匹配的字符串,模式修正符)
            # 结果:匹配结果对象
    #split()    使用正则表达式切割字符串
            #格式:re.split(正则表达式,匹配的字符串,最大切割次数)
            #结果:切割后的字符串组成的列表
    #sub()      正则替换
            #格式:re.sub(正则表达式,替换的字符串,匹配的字符串,替换次数)
            #结果:匹配字符串被替换后的字符串
    #subn()      正则替换
            #格式:re.subn(正则表达式,替换的字符串,匹配的字符串,替换次数)
            #结果:由替换之后的字符串和替换次数组成的元组!
#导入re模块
import re

#compile()    1.编译正则表达式,获取正则表达式对象   2.可以循环利用,提高程序效率
pattern1 = r'\d{13}'
print(pattern1,type(pattern1))              #\d{13} <class 'str'>

pattern1_obj = re.compile(pattern1,re.I)
print(pattern1_obj,type(pattern1_obj))      #re.compile('\\d{13}', re.IGNORECASE) <class '_sre.SRE_Pattern'>

# escape()   对字符串进行转义处理
s1= 'how old are you? i am 25'
result1 = re.escape(s1)
print(result1)               #how\ old\ are\ you\?\ i\ am\ 25

# findall()  对字符串进行正则匹配,获取所有匹配的内容结果
pattern2 = r'baidu'
s2 = 'www.baidu.com-www.BAIDU.com-www.BaiDu.com'
result2 = re.findall(pattern2,s2,re.I)
print(result2)               #['baidu', 'BAIDU', 'BaiDu']

# finditer()
pattern3 = r'baidu'
s3 = 'www.baidu.com-www.BAIDU.com-www.BaiDu.com'
result3 = re.finditer(pattern3,s3,re.I)
print(result3)      #<callable_iterator object at 0x00000185E6884278>

for i in result3:
    print(i)       #<callable_iterator object at 0x0000016B4FB242B0>
    # <_sre.SRE_Match object; span=(4, 9), match='baidu'>
    # <_sre.SRE_Match object; span=(18, 23), match='BAIDU'>
    # <_sre.SRE_Match object; span=(32, 37), match='BaiDu'>

#search()
pattern4 = r'lmonkey'
str4 = 'www.lmonkey.com;mp4.lmonkey.com;bbs.lmonkey.com'
result4 = re.search(pattern4,str4)
print(result4)          #<_sre.SRE_Match object; span=(4, 11), match='lmonkey'>
print(type(result4))    #<class '_sre.SRE_Match'>

#match()
pattern5 = r'lmonkey'
str5 = 'lmonkey.com;mp4.lmonkey.com;bbs.lmonkey.com'
result5 = re.match(pattern5,str5)
print(result5)          #<_sre.SRE_Match object; span=(0, 7), match='lmonkey'>
print(type(result5))    #<class '_sre.SRE_Match'>

#split()    使用正则表达式切割字符串
s6 = '10世9贫,凑得8两7钱6分5毫4厘,况且3心2意,1等下流'
pattern6 = r'\d+'   #按照数字分割
result6 = re.split(pattern6,s6)
result6_2 = re.split(pattern6,s6,3)  #切割3次
print(result6)          #['', '世', '贫,凑得', '两', '钱', '分', '毫', '厘,况且', '心', '意,', '等下流']
print(result6_2)          #['', '世', '贫,凑得', '两7钱6分5毫4厘,况且3心2意,1等下流']

#sub()      正则替换
s7 = '蜡笔小新的爸爸是野原广志,蜡笔小新的妈妈是野原美伢,蜡笔小新的妹妹是野原葵'
pattern7 = r'蜡笔小新'
replace_s = '野原新之助'
result7 = re.sub(pattern7,replace_s,s7,2)   #替换两次
print(result7)      #野原新之助的爸爸是野原广志,野原新之助的妈妈是野原美伢,蜡笔小新的妹妹是野原葵

#subn()      正则替换
s8 = '蜡笔小新的爸爸是野原广志,蜡笔小新的妈妈是野原美伢,蜡笔小新的妹妹是野原葵'
pattern8 = r'蜡笔小新'
replace_s = '野原新之助'
result8 = re.subn(pattern8,replace_s,s8,2)   #替换两次
print(result8)      #('野原新之助的爸爸是野原广志,野原新之助的妈妈是野原美伢,蜡笔小新的妹妹是野原葵', 2)
'''

#正则对象的方法(借助compile方法获取)   rx代表正则对象
'''
    #findall()  使用正则表达式对指定的字符串进行匹配,获取所有匹配结果组成的列表
        #格式:rx.findall(要匹配的字符串)
        #结果:所有匹配结果组成的列表
    #finditer() 使用正则表达式对象对指定的字符串进行匹配,获取所有匹配结果对象组成的迭代器
        #格式:rx.finditer(要匹配的字符串)
        #结果:迭代器
    #match()    使用正则表达式对象对指定的字符串开头进行匹配,返回第一次匹配到的结果对象
        #格式:rx.match(要匹配的字符串)
        #结果:匹配结果对象
    #search()   使用正则表达式对象对指定的字符串进行匹配,返回第一次匹配到的结果对象
        #格式:rx.search(要匹配的字符串)
        #结果:匹配结果对象
    #split()    正则切割字符串
        # 格式:rx.split(s)
        # 结果:切割之后的字符组成的列表
    #sub()      正则替换
        #格式:rx.sub(要替换承成的内容,被替换的字符串,替换次数)
        #结果:替换之后的字符串
    #subn()     正则替换
        #格式:rx.subn(要替换承成的内容,被替换的字符串,替换次数)
        #结果:替换之后的字符串和次数组成的元组

    # flags         获取当前正则对象的模式修正符
    # pattern       获取正则表达式的字符串格式
    # groups        模式单元的个数
    # groupindex




import re
#正则对象
#匹配操作1 re模块  (正则表达式,字符串)   =>  结果对象
#匹配操作2 正则表达式对象 (字符串)   =>  结果对象

#findall()   使用正则表达式对指定的字符串进行匹配,获取所有匹配结果组成的列表
s1 = 'www.baidu.com;mp4.BAIDU.com;image.BaiDu.com'
rx1 = re.compile(r'baidu',re.I)
print(rx1,type(rx1))      #re.compile('baidu', re.IGNORECASE) <class '_sre.SRE_Pattern'>
result1 = rx1.findall(s1)
print(result1)          #['baidu', 'BAIDU', 'BaiDu']

#finditer()   使用正则表达式对指定的字符串进行匹配,获取所有匹配结果组成的列表
s2 = 'www.baidu.com;mp4.BAIDU.com;image.BaiDu.com'
rx2 = re.compile(r'baidu',re.I)
print(rx2,type(rx2))      #re.compile('baidu', re.IGNORECASE) <class '_sre.SRE_Pattern'>
result2 = rx2.finditer(s2)
print(result2)          #<callable_iterator object at 0x0000022BB0FE4240>

for i in result2:
    print(i)
    # <_sre.SRE_Match object; span=(4, 9), match='baidu'>
    # <_sre.SRE_Match object; span=(18, 23), match='BAIDU'>
    # <_sre.SRE_Match object; span=(34, 39), match='BaiDu'>

#match()    使用正则表达式对象对指定的字符串开头进行匹配,返回结果对象
s3 = 'baidu.com;mp4.BAIDU.com;image.BaiDu.com'
rx3 = re.compile(r'baidu',re.I)
print(rx3,type(rx3))
result3 = rx3.match(s3)
print(result3)      #<_sre.SRE_Match object; span=(0, 5), match='baidu'>

#search()
s4 = 'tieba.baidu.com;mp4.BAIDU.com;image.BaiDu.com'
rx4 = re.compile(r'baidu',re.I)
print(rx4,type(rx4))
result4 = rx4.search(s4)
print(result4)      #<_sre.SRE_Match object; span=(6, 11), match='baidu'>

#split()    正则切割字符串
s5 = '10世9贫,凑得8两7钱6分5毫4厘,况且3心2意,1等下流'
rx5 = re.compile(r'\d+')
print(rx5,type(rx5))
result5 = rx5.split(s5)
print(result5)      #['', '世', '贫,凑得', '两', '钱', '分', '毫', '厘,况且', '心', '意,', '等下流']

#sub()      正则替换
s6 = '蜡笔小新的爸爸是野原广志,蜡笔小新的妈妈是野原美伢,蜡笔小新的妹妹是野原葵'
rx6 = re.compile(r'的')
print(rx6,type(rx6))
result6 = rx6.sub('の',s6,2)
print(result6)      #蜡笔小新の爸爸是野原广志,蜡笔小新の妈妈是野原美伢,蜡笔小新的妹妹是野原葵

#subn()      正则替换
s7 = '蜡笔小新的爸爸是野原广志,蜡笔小新的妈妈是野原美伢,蜡笔小新的妹妹是野原葵'
rx7 = re.compile(r'的')
print(rx7,type(rx7))
result7 = rx7.subn('の',s7,2)
print(result7)      #('蜡笔小新の爸爸是野原广志,蜡笔小新の妈妈是野原美伢,蜡笔小新的妹妹是野原葵', 2)


# flags 获取当前正则对象的模式修正符
rx8 = re.compile(r'\w+',re.I)
print(rx8.flags)     #34     34是模式修正符的编号

# pattern   获取正则表达式的字符串格式
rx9 = re.compile(r'(?sx)\w+',re.I)
print(rx9.pattern)      #(?sx)\w+

# groups
rx10 = re.compile(r'(?sx)\w+(\d)\S')
print(rx10.groups)      #1    说明有1个模式单元(\d)

# groupindex
rx11 = re.compile(r'(?sx)(?P<a>\w+)(\d)(?P<b>\S)')
print(rx11.groupindex)  #{'a': 1, 'b': 3}
'''

#正则对象的扩展用法(re下不可以这么用)
'''
    # findall(s,开始位置,介绍位置)
    # finditer(s,开始位置,介绍位置)
    # match(s,开始位置,介绍位置)
    # search(s,开始位置,介绍位置)
import re

s = 'https://www.lmonkey.com'
pattern = r'lmonkey'  #正则表达式
rx = re.compile(pattern)
result = rx.findall(s)
print(result)           #['lmonkey']

s2 = 'https://www.lmonkey.com'
pattern2 = r'lmonkey'  #正则表达式
rx2 = re.compile(pattern2)
result2 = rx2.findall(s2,0,10)    #匹配0-10的字符
print(result2)          #[]

s3 = 'https://www.lmonkey.com'
pattern3 = r'lmonkey'  #正则表达式
rx3 = re.compile(pattern2)
result3 = rx3.findall(s3,10)    #匹配10以后的字符
print(result3)          #['lmonkey']
'''

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值