• python第一篇:正则表达式的方法简单归纳


    首先先对一些常用的匹配模式进行一下介绍及互相认识一下,当然了可能它认识我,但我绝对还不认识它。。。
    ********************************************
    元字符 【 . ^ $ * + ? {} [] | () 】
    ********************************************
    1、[.] 匹配任意1个字符,除了换行符( )。
    要匹配包括‘ ‘在内的任何字符,就使用'[. ]'的模式
    例:
    import re
    print(re.findall(r'a.','ab ac afbbbb'))
    >> ['ab', 'ac', 'af']
     
    2、[|] 或 匹配符号左边或右边的字符
    例:
    import re
    str1='dit dot det,dct dit dot'
    print (re.findall('det|dct',str1))
    >> ['det', 'dct']
    3、[] 字符集合,匹配这个集合里面的任意一个就可以
    [ic]表示i或c,'d[ic]t'表示dit和dct两者,和'dit|dct'等价
    [^abc ] 代表反取,代表取abc之外的字符串
    例:
    import re
    str1='dit dot det,dct dit dot'
    print (re.findall('d[ic]t',str1))
    >> ['dit', 'dct', 'dit']
    4、^ 表示否定 [^ic]表示 除了i和c
    例:
    import re
    str1='dit dot det,dct dit dot'
    print (re.findall('d[^ic]t',str1))
    >> ['dot', 'det', 'dot']
    4-2 匹配字符串的开头 ^dit 表示子串dit在开头位置
    例:
    import re
    str1='dit dot det,dct dit dot'
    print (re.findall('^dit',str1))
    >> ['dit']
     
    5、$ 匹配字符串的末尾 'dot$' 表示子串dot要在末尾位置
    import re
    str1='dit dot det,dct dit dot'
    print (re.findall('dot$',str1))
    >> ['dot']
    6、+ ‘di+t’ 表示d与t之间省略了一个或多个i
    import re
    str1='dit dot det,dct diit dot'
    print (re.findall('di+t',str1))
    >> ['dit', 'diit']
    7、* 匹配*号前的一个字符0次或多次
    ‘di*t’表示d与t之间省略了零个至多个i
    import re
    str1='dit dt det,dct diit dot'
    print (re.findall('di*t',str1))
    >> ['dit', 'dt', 'diit']
    扩展 ‘.+’搭配使用,表示省略了一个至多个任意元素
    ‘.*’ 搭配使用,表示省略了零个至多个任意元素
    import re
    str1='d dt dit diit dot'
    print (re.findall('d.*t',str1))
    print (re.findall('d.+t',str1))
    >> ['d dt dit diit dot']
    >> ['d dt dit diit dot']
     
    8、? 匹配?前的一个字符0次或1次 ‘di?t’表示i可有可无,即dt,dit都满足条件
    import re
    str1='d dt dit diit det'
    print(re.findall('di?t',str1))
    >> ['dt', 'dit']
    8-2 ? 清除贪婪匹配
     
    9、{} di{n}t 表示d和t之间有n个i
    import re
    str1='d dt dit diit det'
    print(re.findall('di{2}t',str1))
    >> ['diit']
    9-2 {} di{n,m}t 表示d和t之间有n到m个i
    import re
    str1='d dt dit diit diiiit det'
    print(re.findall('di{2,4}t',str1))
    >> ['diit', 'diiiit']
    扩展:n和m都可以省略。{n,}表示n个到任意个;{,m}表示0到m个;{,}表示任意个
    import re
    str1='d dt dit diit diiit diiiit det'
    print(re.findall('di{3,}t',str1))
    print(re.findall('di{,3}t',str1))
    print(re.findall('di{,}t',str1))
    >> ['diiit', 'diiiit']
    ['dt', 'dit', 'diit', 'diiit']
    ['dt', 'dit', 'diit', 'diiit', 'diiiit']
    10、 取消元字符,变成转义字符
    就是说如果你想让特殊字符失去python语言赋予的意义变成普通字符,就在前面加上
    例:
    import re
    print(re.findall(r'?.','ab? ac af?bab?b'))
    >> ['? ', '?b', '?b']
    10-2、 预定义字符
    例:
    import re
    str1='12 abd 34 def'
    print(re.findall('d',str1))
    print(re.findall('w',str1))
    >> ['1', '2', '3', '4']
    ['1', '2', 'a', 'b', 'd', '3', '4', 'd', 'e', 'f']
    11、() 在匹配字符串后,只输出匹配字串()里面的内容
    import re
    str1='12abcd34'
    print(re.findall('12abcd34',str1))
    print(re.findall('1(2a)bcd',str1))
    print(re.findall('1(2a)bc(d3)4',str1))
    >> ['12abcd34']
    ['2a']
    [('2a', 'd3')]
     
    ***************************************************************
    re模块的主要方法
    findall() finditer() match() search() compile() aplit() sub() subn()
    ***************************************************************
    1、re.match(1正则表达式,2要匹配的字符串,3标志位“用于控制正则表达式的匹配方式”)
    开始位置:从第一个单词中匹配字符串,如果匹配到就返回一个结果,匹配不到就返回None
    例:
    import re
    print (re.match('www','www.baidu.com').span())
    print (re.match('baidu','www.baidu.com'))
    >> (0, 3)
    None
    2、re.search(1正则,2原字符串,3标志位)
    匹配规则:扫描整个字符串并返回第一个成功匹配的结果,没有就返回None
    例:
    import re
    print (re.search('www','www.baidu.com').span())
    print (re.search('baidu','www.baidu.com.baidu').span())
    >> (0, 3)
    (4, 9)
    3、re.findall()
    匹配规则:从左往右搜索,结果1以list的形式返回,没有匹配到就返回空列表
    例:
    import re
    print (re.findall('www','www.baidu.com.wwww'))
    print (re.findall('www','nishuosdhsds'))
    >>['www', 'www']
    []
    4、re.finditer()
    匹配规则:从左往右搜索,但是结果以迭代器的形式返回
    例:
    import re
    str1='ab cd e'
    istr1=re.finditer('w+',str1)
    for a in istr1:
    print (a.group(),a.span())
    扩展:a.group()返回满足匹配调节的子串,a.span()返回子串的起始位置 和末尾位置
    >> ('ab', (0, 2))
    ('cd', (3, 5))
    ('e', (6, 7))
    5、re.compile()
    匹配规则:对匹配格式先进行编译,返回一个实例对象。然后再使用它,可以加快匹配速度
    例:
    import re
    str1='abcdeabfg'
    pre=re.compile('ab')
    print (pre.findall(str1))
    >> ['ab', 'ab']
    6、re.split()
    匹配规则:在string匹配正则表达式时进行分割
    例:
    import re
    str1='abc.d.ea.bfg.rere'
    str2='12+34-56*78/90'
    print (re.split('.',str1))
    print (re.split('[+-*/]',str2))
    >> ['abc', 'd', 'ea', 'bfg', 'rere']
    ['12', '34', '56', '78', '90']
    7、re.sub(1正则,2替换的字符串,3原始字符串,4匹配后替换的最大次数)
    匹配规则:用于替换字符串中的匹配项
    例;
    import re
    str1='abcdefg'
    print (re.sub('b','123',str1))
    >> a123cdefg
    8、re.subn()
    匹配规则:功能与sub相似,但返回结果多了一个数字,代表替换了多少次
    例:
    import re
    str1='abcdebnfgcb'
    print (re.subn('b','123',str1))
    >> ('a123cde123nfgc123', 3)
     
    ****************************************************
    还有一些关于字母的 A B dD G sS wW z
    #####[0-9] [a-z] [A-Z] [a-zA-Z0-9] [^0-9]
    ****************************************************
    1、A 匹配字符串开始,不能进行多行匹配(^)
    例:
    import re
    print(re.findall(r'Ahttp://','http://www.baidu.com is good http://www.sohu.com',re.M))
    >> ['http://']
    2、 匹配字符串的结尾,不能进行多行匹配($)
    例:
    import re
    print(re.findall(r'.jpge|.png|.gif','touxiang.gif qq.png',re.M))
    >> ['.png']
    3、d 匹配一个数字
    w 匹配一个字母或数字
    . 匹配任意字符
    例:
    '00d' 可以匹配'007',不能匹配'00A'
    'ddd'可以匹配'010'
    'wwd'可以匹配'py3
    'py.'可以匹配'py1''pyc''py!'
     
    * 匹配任意个字符(包括0个)
    . 匹配1个字符
    + 匹配至少一个字符
    ?表示0个或1个字符
    {n} 表示n个字符
    {n,m}表示n-m个字符
     
    4、s 匹配任意空白字符
    S匹配任意非空字符
    例:
    d{3}s+d{3,8}
    >> d{3} 表示匹配3个数字 如'010'
    s 可以匹配一个空格 s+表示至少有一个空格 如' ',' '等
    d{3,8} 表示3-8个数字 如'1234567'
    5、精确匹配
    [0-9a-zA-Z\_] 可以匹配一个数字、字母或下划线
    [0-9a-zA-Z\_]+ 可以匹配至少由一个数字、字母或下划线组成的字符串。如'a100','0_z','Py003'
    [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母下划线开头,后接任意一个数字、字母下划线组成的字符串
    [a-zA-Z\_][0-9a-zA-Z\_]{0,19}限制了变量的长度是1-20个字符(前面一个字符+后面最多19个字符)
    ^ 表示行的开头,^d 表示必须以数字开头
    $ 表示行的结束 d$表示必须以数字结束
     
    ************************************************
    分组
    除了简单的判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(group)
    ************************************************
    1、group()或group(0)就是匹配正则表达式整体结果
    例:
    import re
    test='010-12345'
    m= re.match(r'^d{3}-d{3,8}$',test)
    print (m.span(),m.group())
    >> ((0, 9), '010-12345')
    2、group(1)列出第一个括号匹配的部分,group(2)列出第二个括号匹配的部分.
    如果正则表达式中没有括号,group(1)肯定是不对的了。
    例:
    import re
    a='123abc456'
    print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group())
    print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group(1))
    print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group(2))
    print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group(3))
    >> 123abc456
    123
    abc
    456
    3、groups() 返回一个包含所有小组字符串的元组,从1到所含的小组号
    例:
    import re
    a='123abc456'
    print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group())
    print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group(1))
    print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group(2))
    print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).group(3))
    print (re.search('([0-9]*)([a-z]*)([0-9]*)',a).groups())
    >> 123abc456
    123
    abc
    456
    ('123', 'abc', '456') 重要看这条!!!
    **********************************************
    贪婪匹配
    **********************************************
    正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
    例:
    import re
    print (re.match(r'^(d+)(0*)$','1012300').groups())
    >> ('1012300', '')
    此处d+采用贪婪匹配,直接把后面的0也给匹配了,导致0*智能匹配空字符串
    加个?就可以让d+采用非贪婪匹配
    例:
    import re
    print (re.match(r'^(d+?)(0*)$','1012300').groups())
    >> ('10123', '00')
  • 相关阅读:
    0401. Binary Watch (E)
    0436. Find Right Interval (M)
    0151. Reverse Words in a String (M)
    1344. Angle Between Hands of a Clock (M)
    0435. Non-overlapping Intervals (M)
    0434. Number of Segments in a String (E)
    0063. Unique Paths II (M)
    0062. Unique Paths (M)
    0100. Same Tree (E)
    0190. Reverse Bits (E)
  • 原文地址:https://www.cnblogs.com/pf109/p/9896829.html
Copyright © 2020-2023  润新知