re模块--高级用法

re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。

格式:re.search(pattern, string, flags=0)

需求:匹配出文章阅读的次数

#coding=utf-8
import re

ret = re.search(r"\d+", "阅读次数为 9999")
ret.group()

运行结果:

'9999'

match()和search()的区别:

match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配;

也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none。

如:print(re.match(‘super’, ‘superstition’).span()) 会返回(0, 5)

​ print(re.match(‘super’, ‘insuperable’)) 则返回None

如:print(re.search(‘super’, ‘superstition’).span())返回(0, 5)

​ print(re.search(‘super’, ‘insuperable’).span())返回(2, 7)

2、findall

re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。

格式:re.findall(pattern, string, flags=0)

需求:统计出python、c、c++相应文章阅读的次数

#coding=utf-8
import re

ret = re.findall(r"\d+", "阅读次数:9999次,转发次数:883次,评论次数:3次")
print(ret)

运行结果:

['9999', '883', '3']

3、sub 将匹配到的数据进行替换

使用re替换string中每一个匹配的子串后返回替换后的字符串。

格式:re.sub(pattern, repl, string, count)

需求:将匹配到的阅读次数加1

方法1:

#coding=utf-8
import re

ret = re.sub(r"\d+", "10000", "阅读次数:9999次,转发次数:883次,评论次数:3次") print(ret) 

运行结果:

阅读次数:10000次,转发次数:10000次,评论次数:10000次

方法2:

#coding=utf-8
import re

def add(temp): strNum = temp.group() num = int(strNum) + 1 return str(num) ret = re.sub(r"\d+", add, "python = 997") print(ret) ret = re.sub(r"\d+", add, "python = 99") print(ret) 

运行结果:

python = 998
python = 100

4、split 根据匹配进行切割字符串,并返回一个列表

按照能够匹配的子串将string分割后返回列表。

可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。

格式:re.split(pattern, string[, maxsplit])

需求:切割字符串“info:xiaoZhang 33 shandong”

#coding=utf-8
import re

ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)

运行结果:

['info', 'xiaoZhang', '33', 'shandong']

5、python贪婪和非贪婪

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

非贪婪则相反,总是尝试匹配尽可能少的字符。

在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。

import re

# 匹配多个数字
result = re.match(r"aaa(\d+)", "aaa123456")
if result: print(result.group()) else: print("匹配失败~!") 

匹配的结果:

aaa123456

解决方式:非贪婪操作符“?”,这个操作符可以用在"*","+","?"的后面,要求正则匹配的越少越好。

# 匹配多个数字
result = re.match(r"aaa(\d+?)", "aaa123456")
if result:
    print(result.group())
else: print("匹配失败~!") 

运行结果:

aaa1

6、r的作用

>>> mm = "c:\\a\\b\\c"
>>> mm
'c:\\a\\b\\c'
>>> print(mm) c:\a\b\c >>> re.match("c:\\\\",mm).group() 'c:\\' >>> ret = re.match("c:\\\\",mm).group() >>> print(ret) c:\ >>> ret = re.match("c:\\\\a",mm).group() >>> print(ret) c:\a >>> ret = re.match(r"c:\\a",mm).group() >>> print(ret) c:\a >>> ret = re.match(r"c:\a",mm).group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> 

说明

Python中字符串前面加上 r 表示原生字符串

与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

>>> ret = re.match(r"c:\\a",mm).group()
>>> print(ret)
c:\a
 

转载于:https://www.cnblogs.com/yu110812/p/9487729.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值