正则表达式的使用

1.引入

开源中国: https://tool.oschina.net/regex

正则表达式实现的字符串的检索,替换,匹配匹配验证。

2.match()

match()方法尝试从字符串的起始位置匹配正则表达式,匹配成功就返回结果,不成功返回None

match()方法第一个参数传入正则表达式,第二个表示要匹配的字符串

import re
content='Hello 123 456 World_This is a Regix Demo'
print(len(content))
result=re.match('^Hello\s\d\d\d\s\d{3}\s\w{10}',content)
print(result)
print(result.group())#group()输出匹配的内容
print(result.span())#span()输出匹配的范围
'''
^Hello表示以Hello开头
\s表示匹配空白字符
\d表示匹配数字,\s匹配空白字符
\d{3}表示前面的规则匹配三次等价于\d\d\d
\w{10}表示匹配10个字母,数字或者下划线
'''
  • 匹配目标

    import re
    content='Hello 123456 World_This is a Regix Demo'
    result=re.match('^Hello\s(\d+)\sWorld',content)
    print(result)
    print(result.group())
    print(result.group(1))
    print(result.span())
  • 通用匹配

    .*:

    .表示匹配任意字符,

    *表示匹配前面的字符无限次

    import re
    content='Hello 123456 World_This is a Regix Demo'
    result=re.match('^Hello\s(\d+)\sWorld',content)
    print(result)
    print(result.group())
    print(result.group(1))
    print(result.span())
  • 贪婪与非贪婪

    import re
    content='Hello 1234567 World_This is a Regix Demo'
    result=re.match('^He.*(\d+).*Demo',content)
    print(result.group())
    print(result.group(1))

    输出:

    Hello 1234567 World_This is a Regix Demo
    7

    具体匹配过程:开头先匹配He,然后.*继续匹配,直到碰到数字1,因为此时为贪婪模式,. *会匹配尽可能多的字符,此正则表达式. *后是\d+,也就是最少一个数字,并没有指定多少个数字,于是. *尽可能匹配多的数字,匹配到了123456,给\d+留下的就是7了,所以只得到了7

    import re
    content='Hello 1234567 World_This is a Regix Demo'
    result=re.match('^He.*?(\d+).*Demo',content)
    print(result.group())
    print(result.group(1))

    输出:

    Hello 1234567 World_This is a Regix Demo
    1234567

    这里只在.*后加了?,就变为了非贪婪匹配,非贪婪匹配在匹配时会进可能匹配少的字符,当. *?匹配到Hello后的空格时,在往后就是数字,而\d+正好可以匹配,那么. *?不在进行匹配,而是交给\d+去匹配,\d+匹配的结果就是1234567。

    注意:

    匹配时,字符串中间尽量使用非贪婪匹配,就是. *?代替. *

    当. *?放在最后时,可能匹配不到任何内容

    import re
    content ='https://www/baidu.com/comment/wd'
    result1=re.match('^ht.*?comment/(.*?)',content)
    result2=re.match('^ht.*?comment/(.*)',content)
    print(result1.group())
    print('reslult1',result1.group(1))
    print('reslult2',result2.group(1))

    输出:

    https://www/baidu.com/comment/
    reslult1
    reslult2 wd

  • 修饰符

    import re
    content='''Hello 123456 World_This
    is a Regix Demo
    '''
    result=re.match('^He.*?(\d+).*Demo',content,re.S)#若没有re.S,.就无法匹配换行符,程序报错
    print(result.group())
    print(result.group(1))

    修饰符:

    re.I——–使匹配对大小写不敏感

    re.S——–使.匹配包括换行符在内的所有字符

  • 转义匹配

    .可以匹配换行符以外的字符,但是目标字符串中包含.就需要转义

    import re
    content='(百度)www.baidu.com'
    result=re.match('\(百度\)www\.baidu\.com',content)
    print(result.group())

match()方法是从字符串的开头匹配,一旦开头不匹配,整个匹配失败

import re
content='No Hello 123456 World_This is a Regix Demo'
result=re.match('He.*?(\d+).*Demo',content,re.S)
print(result)

输出:None

search()方法在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果。也就是说,正则表达式可以是字符串的一部分。

import re
content='No Hello 123456 World_This is a Regix Demo'
result=re.search('He.*?(\d+).*Demo',content,re.S)
print(result)

实例:

import re
html = '''
    <div id="songs-list">
    <h2 class="title">流行金曲</h2>
    <p class = "introduction">经典歌曲列表</p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
        </li>
    </ul>
</div>    
'''
res=re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>',html,re.S)
#print(res.group())
print(res.group(1),res.group(2))

#输出
#齐秦 往事随风
4.findall()

search()方法,它返回匹配表达式的第一个内容。 findall()方法会搜索整个字符串,返回匹配正则表达式的所有内容。

import re
html = '''
    <div id="songs-list">
    <h2 class="title">流行金曲</h2>
    <p class = "introduction">经典歌曲列表</p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
        </li>
    </ul>
</div>    
'''
results=re.findall('<a.*?singer="(.*?)">(.*?)</a>',html,re.S)#如果有返回结果,就是列表类型
# print(results)
# print(type(results))
for result in results:
    print(result)
    print(result[0],result[1])
5.sub()

借助正则表达式来修改文本。例如,把一串文本中的所有数字去掉。

import re
content='45a4fsfafa545g46afds2fa13fafsaf'

content=re.sub('\d+','',content)#\d+来匹配所有数字,第二个参数为替换成的字符串,第三个为原字符串
print(content)

借助sub提取歌曲名

import re
html = '''
    <div id="songs-list">
    <h2 class="title">流行金曲</h2>
    <p class = "introduction">经典歌曲列表</p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
        </li>
    </ul>
</div>    
'''
html=re.sub('<a.*?>|</a>','',html)
print(html)
htmls=re.findall('<li.*?>(.*?)</li>',html,re.S)
print(htmls)
for res in htmls:
    print(res.strip())#移除开头或者结尾指定的字符,默认为空格或者换行符
6.compile()

此方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。

import re
content1='2019-11-25 12:00'
content2='2019-11-20 11:00'
content3='2019-11-15 14:00'
pattern=re.compile('\d{2}:\d{2}')
res1=re.sub(pattern,'',content1)
res2=re.sub(pattern,'',content2)
res3=re.sub(pattern,'',content3)
print(res1,res2,res3)

   转载规则


《正则表达式的使用》 White Spider 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录