常用语法表
语法 | 描述 |
---|---|
. | 匹配任何字符,除了换行符 |
\w | 匹配总目,数字及下划线 |
\W | 匹配不是字母,数字及下划线的字符 |
\s | 匹配任意空白字符,等价于[\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非数字的字符 |
\A | 匹配字符串开头 |
\b | 匹配·一个字边界, 即字与空格间的位置 |
\B | 非字边界匹配 |
\Z | 匹配字符串结尾,如果存在换行,只能匹配到换行前的结束字符串 |
\z | 匹配字符串结尾,如果存在换行,同时还会匹配换行符 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
^ | 匹配一行字符串的开头 |
$ | 匹配一行字符串的结尾 |
[...] | 用来表示一组字符,单独列出,比如[dhb]匹配d、h或b |
[^...] | 匹配不在[]中的字符,除X、X、X之外的 |
* | 匹配0个或多个表达式 |
+ | 匹配一个或多个表达式 |
? | 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式 |
{n} | 精准匹配n个前面的表达式 |
{n, m} | 匹配n到m次由前面正则表达式定义的片段,贪婪方式 |
| , a|b | 指明两项之间的一个选择,匹配a或b |
() | 匹配括号内的表达式 |
- 通用匹配
import re
content = 'hello 123 4576 world_This is a Regex Demo'
print(len(content))
# match()方法,第一个参数传入正则表达式,第二个参数传入要匹配的字符串
result = re.match('^hello.*Demo$', content) # (.点)可以匹配任意字符(除换行符),*(星)代表匹配前面的字符无限次
print(result)
print(result.group())
# group()方法可以输出匹配到的内容
print(result.span())
# span()方法可以输出匹配的范围
"""
result = re.match('^hello\s(\d+)\sworld', content) # ()把想要提取的字符括起来
print(froup(1)) # 输出第一个被()的匹配结果
"""
- 贪婪与非贪婪
.*
贪婪模式,匹配多的内容
.*?
非贪婪模式。匹配较少的内容
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
print(result)
print(result.group(1))
# 贪婪匹配
# .*会匹配尽可能多的字符。正则表达式中.*后面是\d+,也就是至少一个数字,并没有指定具体多少个数字,
# .*就尽可能匹配多的字符,把123456 匹配了,给\d+留下一个可满足条件的数字7 ,最后得到的内容就只有数字7
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$', content)
print(result)
print(result.group(1))
# 非贪婪匹配,尽可能匹配较少的字符
# 当.*?匹配到Hello 后面的空向字符时,再往后的字符就是数字了,而\d+恰好可以匹配,那么这里.*?的就不再进行匹配,交给\d+去匹配后面的数字
- 修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。
import re
content = '''Hello 1234567 World_This
is a Regex Demo'''
result = re.match('^He.*?(\d+).*Demo$', content)
print(result)
print(result.group(1))
# AttributeError: 'NoneType' object has no attribute 'group'
# 因为.匹配的是除换行符之外的任意字符,当遇到换行符时,.就不能匹配了
result = re.match('^He.*?(\d+).*Demo$', content, re.S)
# re.S修饰符的作用是使.匹配包括换行符在内的所有字符
修饰符
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符,影响\w,\W,\b和\B |
re.X | 给予更灵活的格式使正则书写更易于理解、 |
- 转义匹配
如果目标字符串里面包含.的时候,需要用到转义匹配
import re
content = '(百度)www.baidu.com'
result = re.match('\(百度\)www\.baidu\.com', content)
print(result)
# 当遇到用于正则匹配模式的特殊字符时,在前面加反斜线转义一下即可
- search()
前面的match()方法是从字符串的开头开始匹配的,一旦开头不匹配,那么整个匹配就失败
而search()方法,它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果
import re
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra strings'
result = re.search('Hello.*?(\d+).*?Demo', content)
print(result)
# html = '''<li data-view="4" class="active">
# <li data-view="4" class="active">
# <a href="/3.mps" singer="齐秦">往事随风</a>
# </li>
# <li data-view="6"><a href="/4.mps" singer="beyond">光辉岁月</a></li>
# <li data-view="5"><a href="/5.mps" singer="陈慧琳">记事本</a></li>
# <li data-view="5">
# <a href="/6.mps" singer="邓丽君">但愿人长久</a>
# </li>'''
import re
# 想获取singer属性值,需要写入singer=“(.*?)”,需要获取的用小括号包括住,文本的两侧边界是双引号
# 获取a标签内容,两侧边界是<与</a>,中间内容用(.*?)匹配
result = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>', html, re.S)
if result:
print(result.group(1), result.group(2))
- findall()
findall()方法会搜索整个字符串,然后返回匹配正则表达式的所有内容。
import re
results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S)
print(results)
print(type(results))
for result in results:
print(result)
print(result[0], result[1], result[2])
- 修改文本sub()方法
import re
content = '95ak47uz98kb23fu2d4h'
content = re.sub('\d+', '', content)
# 第一个参数传入要匹配的值,第二个参数为替换的字符串(去掉赋值为空),第三个参数为待解析的字符串
print(content)
# 方法比较
import re
results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>', html, re.S)
for result in results:
print(result[1])
# 先用sub()方法将a 节点去掉,只留下文本,然后再利用findall()提取
html = re.sub('<a.*?>|</a>', '', html)
print(html)
results = re.findall('<li.*?>(.*?)</li>', html, re.S)
for result in results:
print(result.strip())
- compile()
将正则字符串编译成正则表达式对象,以便重复使用
import re
content1 = '2019-1-28 20:00'
content2 = '2019-1-29 12:00'
content3 = '2019-1-30 21:20‘
# compile()类似封装的意思,还可以传入修饰符,方便调用
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)