Python 正则表达式 01

Python 正则


Python 的正则表达式 要 配合 re 模块 来进行使用。

那么 在看完 我的这篇 通用正则 文章 后,我们先来 接触一下 在 Python 中 正则表达式 是如何 使用的。

我们也将 通用正则里 的 三个 学习材料,当作 这篇文章的 学习材料!进行 实践和 学习。

match(正则表达式,待匹配的字符串,匹配的其它限制) 傻傻的 match 方法

match() 方法 就是 只能从 起始位置开始 进行一个匹配。如果 匹配不上,那么就 玩完了。肯定会返回给你一个 None

举例:
比如 字符串 abcABC 我们通过 准确搜索,想要匹配 ABC 那么 你用 match 的话,就肯定 是从 起始位置的 a 开始匹配了。那么 这样的话 一辈子 你都匹配不到 ABC。

所以我也把它 称为 傻傻的 方法。。。

但是在有些 应用场景还是很常用的。比如 你想取的数据 就是刚好 从 起始位置开始匹配的。那么 这个 方法就恰到好处了。你不需要 太过于复杂的 编辑 正则表达式。可能就 匹配到了。

import re

待匹配字符串 = open('1.txt','r').read()

print(待匹配字符串)

print(re.match('ABC', 待匹配字符串))  # 在起始位置匹配

在这里插入图片描述
本来呢,这个 字符串里,是有 ABC 的,但是它 就是 取不到。。因为它是 从 起始位置开始匹配的。

serach(正则表达式,待匹配的字符串,匹配的其它限制) 它才是我们最常用的匹配方法,因为我们的正则表达式 就是要 把 所有的字符串都进行一个扫描的。

唯一的缺点就是 只能捕获到第一个匹配的 字符串

import re

待匹配字符串 = open('1.txt','r').read()

# print(待匹配字符串)

print(re.match('ABC', 待匹配字符串))  # 在起始位置匹配
print(re.search('ABC',待匹配字符串).span()) # 把全部字符串都进行扫描

print(待匹配字符串[27:30])

在这里插入图片描述

searchObj.group() 和 searchObj.groups() 我们匹配到的项 是可以通过 group 进行一一获取的。

这个所谓的匹配到的项,还是有点儿讲究的。

我们 pyrhon 的 re 规定,凡是 在 正则表达式里 : () 用括号括上的,都算是可以匹配到的项。

line = "Cats are smarter than dogs";

searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)

if searchObj:
    print("searchObj.group() : ", searchObj.group())
    
    print("searchObj.group(1) : ", searchObj.group(1))
    
    print("searchObj.group(2) : ", searchObj.group(2))
    
else:
    print("Nothing found!!")

我们可以看到,(.*) 匹配任意字符0到无限个,已经被 括号 括起来了!所以这个 也算是一个 可以匹配到的项。
在这里插入图片描述

(?P<groupKey>正则表达式)它的意思是 我们规定一个 Key,进行 可以匹配到的项 的 关键字。然后可以通过 group(Key) 来直接获取到这个项。

这样做的目的是 方便我们找到 我们需要的项。而不是通过 1、2、3 这样的无真实含义的数字来做关键字。

line = "Cats are smarter than dogs";

searchObj = re.search(r'(?P<pre>.*) are (?P<end>.*?) .*', line, re.M | re.I)

if searchObj:
    print("searchObj.group('pre') : ", searchObj.group('pre'))

    print("searchObj.group('end') : ", searchObj.group('end'))

    print("searchObj.group() : ", searchObj.group())

else:
    print("Nothing found!!")

在这里插入图片描述

re.sub('正则表达式','替换后的字符串',待匹配的字符串,count=匹配次数) 匹配到的字符串 会被 替换为 你提供的 替换后字符串。如果count为空,那么它就会 从头到尾 一直 扫描,所有 能够匹配到的字符串,然后一一进行替换。

待匹配的字符串 还可以写为一个函数,参数是 自动提供给你一个 匹配结果的迭代器。可以用 .group() 来获取到 匹配项的值

# 将匹配的数字乘以 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)

s = 'A23G4HFD567'
searchObj = re.search('(\d+)',s)
findallObj = re.findall('(\d+)',s)
print(findallObj)

print(re.sub('(?P<value>\d+)', double, s))

在这里插入图片描述

findall('正则表达式',待匹配的字符串,一些其它的限制条件) 可以匹配到所有符合正则表达式的 字符串。不单单只匹配一个。这个我们 用的 也是最多的!因为 我们 爬虫往往 用正则取的数据都是 粗略的。取下来之后 我们 都是用 字符串方法 去进行二次处理的。这样是 最高效,也是最方便,最容易的。

print(re.findall('\d+', s))

在这里插入图片描述

finditer('正则表达式',待匹配的字符串,一些其它的限制条件) 也是可以匹配到所有符合正则的 字符串,但是它返回的是一个 迭代器。也就是说 我们要通过 for 循环,进行一个遍历,然后 还要 通过 .group() 来取 匹配项的值。

matchs = re.finditer('\d+',s)

for match in matchs:
    print(match.group())

在这里插入图片描述

split('正则表达式','待匹配的字符串',一些其它的限制条件) 就是将匹配到的字符串,用来 作为分隔符,然后 进行字符串的分割,最后 返回一个列表。这个 在一些特殊场景,还是 很实用的!我们也把 正则的这种 split 称为 字符串的高级分割! 当然 字符串的 split 好像也支持 正则表达式,哈哈 ~ ~

print(re.split('\d+', s)) # 比如让中间的这些数字 作为 分隔符,很轻松 就能做到。

在这里插入图片描述

re.compile(正则表达式) 这个方法是很重要的,我们 如果想要 正常的 使用 re 这个模块的正则匹配功能。就必须 先用这个 方法 来进行 正则表达式的编译,生成一个正则表达式( Pattern )对象。

我们通过Pattern 对象,可以实现很多 正则的方法,而且这些方法 可能 比你 直接 re.xxx 多了一些功能。

举个例子,比如 我们的 match() 匹配 它是从开头匹配的。但是 通过我们的 compile() 方法编译的 Pattern 对象的 match() 方法 就可以 限制 起始和结束的位置。即 扫描的匹配范围。

pattern = re.compile('ABC')
print(pattern.match(待匹配字符串, 27, 30).span())

在这里插入图片描述
这样 就能 匹配到!这样 就很强了。

PS:这个有多有用呢?我刚学 爬虫的时候,有些时候 一些元素 都太像了。所以 需要进行一个 定位。如果可以 定位 ,那么在 那个范围 进行匹配,就只能匹配到 我想匹配的那个数据了。这样省了 很多麻烦事。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值