正则表达式

一.常用的匹配规则

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

二.常用函数

1. result.group()

  • group方法可以输出匹配到的内容,通过传入索引即可获取提取结果。
import re
#.*:匹配任意字符(除换行符)无限次且尽可能多的匹配字符,所以这里只给\d+留下一个可满足条件的7
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
print(result)
print(result.group(1))
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
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))
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
1234567
import re
# .*?是匹配除换行符之外的所有字符,当遇到换行符后就不匹配了,这种情况需要加一个修饰符re.S
# result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
content = '''Hello 1234567 World_This
is a Regex Demo
'''
result = re.match('^He.*?(\d+).*?Demo$', content)
print(result.group(1))

Traceback (most recent call last):
  File "E:/PycharmProjects/pythonProject/jiahua_test.py", line 7, in <module>
    print(result.group(1))
AttributeError: 'NoneType' object has no attribute 'group'

2. result.search()

  • 扫描整个字符串,返回第一个匹配成功的结果。推荐
  • 对比match(),match方法在使用时需要考虑目标字符串开头的内容。不推荐。
import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
#下面search换成match就匹配不到了
result = re.search('Hello.*?(\d+).*?Demo', content)
print(result.group(1))

3. result.findall()

  • 返回与正则表达式相匹配的所有字符串(search()是一个)。

4. result.sub()

  • 替换匹配到的内容。
import re

content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content)
aKyroiRixLg

5. result.compile()

  • 将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。
import re

content1 = '2019-12-15 12:00'
content2 = '2019-12-17 12:55'
content3 = '2019-12-22 13:21'
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)
2019-12-15  2019-12-17  2019-12-22 

3.注意

  • 转义匹配
import re

content = '(百度) www.baidu.com'
result = re.match('\(百度\) www\.baidu\.com', content)
print(result)
<re.Match object; span=(0, 18), match='(百度) www.baidu.com'>
  • r’\b\n’
前面加'r'是为了告诉编译器,不要对引号里的\b\n进行转义,把它当做普通字符串来看

文章参考:《Python3 网络爬虫开发实战第二版》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值