正则表达式(补充)

一、常见匹配模式

模式 描述
\w 匹配字母数字及下划线
\W 匹配非字母数字下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9]
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
* 匹配0个或多个的表达式。
+ 匹配1个或多个的表达式。
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配n个前面表达式。
{n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a|b 匹配a或b
( ) 匹配括号内的表达式,也表示一个组

二、re.match()方法的使用

re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。

1.最常规的匹配

import re #导包

content = 'Hello 123 456789 World_This is a Regex Demo' # 准备好的待匹配字符串

第一种

res = re.match('^Hello\s\d{3}\s\d{6}\s\w{10}.*Demo$',content)

第二种

a = re.match('.*Demo',content)

print(a.group())

print(res) # 返回的是一个匹配对象

print(res.group()) # .group()获取匹配内容

print(res.span()) # 查看匹配长度 44个字符

2.泛匹配

import re

#写的很简洁

content = 'Hello 123 4567 World_Thixs is a Regex'

result = re.match('He.*?Regex',content)#把一整个文本匹配完成 又不想写的复杂,

print(result.group()) # 获取匹配内容

print(result.span()) # 获取匹配长度

3.匹配目标--分组匹配

为了匹配字符串中具体的目标,可以使用()进行分组匹配 ()括号里面是你要匹配的表达式

import re

content = 'qwe Hello 1234567 World_This is a Regex Demo'

result = re.match('qwe\s(\w+)\s(\d{7}).*Demo',content)

print(result.group()) # 获取匹配内容

print(result.group(1)) # 提取第一组表达式内匹配到的字符

print(result.group(2)) # 提取第二组表达式内匹配的字符

4.贪婪匹配

尽可能多的去匹配

import re

匹配尽可能多的字符

content = 'Hello 1234567 World_This is a Regex Demo'

result = re.match('^He.*(\d+)\s.*Demo$', content)

print(result)

print(result.group(1))

5.非贪婪匹配

尽可能少的去匹配

import re

匹配尽可能少的字符

content = 'Hello 1234567 World_This is a Regex Demo'

result = re.match('^He.*?(\d+).*Demo$', content)

print(result)

print(result.group())

print(result.group(1))

6.匹配模式(换行)

import re

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

content = '''Hello 1234567 World_This

is a Regex Demo

'''

result = re.match('^He.*?(\d+).*Demo$', content,re.S)

print(result)

print(result.group(1))

7.转义

import re

\表示转义,加在特殊字符的前面,表示它不是正则里的匹配符号,而是普通文本

content = 'price is $5.00'

result = re.match('price\sis\s\$5\.00', content)

print(result)

print(result.group())

总结:尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S

三、re.search()方法的使用

re.search() 扫描整个字符串并返回第一个成功的匹配值。

import re

content = 'Extroa stings Hello 1234567 World_This is a 66666666 RDemogex Demo Extra stings'

result = re.search('He.*?(\d+).*?Wor.*?s$', content)

print(result)

print(result.group())

print(result.group(1))

四、re.findall()方法的使用

前面的match()以及search()都只能匹配到第一个

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>'''

用正则匹配出 --- 所有的链接,歌手和歌手名

import re

r = re.findall('<a\shref="(.*?)"\ssinger="(.*?)">(.*?)</a>',html,re.S)

print(r)

五、re.sub()方法的使用

替换字符串中每一个匹配的字符

import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'

第一个参数 正则表达式

第二个参数 :要替换的新字符

第三个参数:原字符串

content = re.sub('s', '7', content)

print(content)

六、匹配演练

复制代码
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"  class='active'><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>'''

# 用正则匹配出 --- 齐秦 往事随风  
import re
r = re.search('<li\sdata-view="4".*?singer="(.*?)">(.*?)</a>',html,re.S)
print(r.group(1))
print(r.group(2))
相关推荐
壹号用户19 小时前
python学习之正则表达式
python·学习·正则表达式
xiaozaq1 天前
java 正则表达式 所有的优先级
java·开发语言·正则表达式
ColderYY1 天前
Python中的正则表达式
开发语言·python·正则表达式
李宥小哥1 天前
正则表达式详解
正则表达式
珊瑚礁的猪猪侠4 天前
正则表达式入门到精通教程(Linux实操版)
linux·人工智能·正则表达式
!win !6 天前
分享二个实用正则
javascript·正则表达式
xw56 天前
分享二个实用正则
javascript·正则表达式
刺客-Andy6 天前
Python 第二十节 正则表达式使用详解及注意事项
python·mysql·正则表达式
好好好起个名真难6 天前
正则表达式
正则表达式
坚持就完事了7 天前
正则表达式与Python的re模块
python·正则表达式