Python3使用正则表达式

正则表达式

1.re的使用过程

# 导入re模块
import re

# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)

# 如果上一步匹配到倒数,可以用group方法来提取数据
result.group()

2.re模块示例

import re 

result = re.match("bupt", "bupt.edu.cn")

result.group()

结果为:

bupt

匹配单个字符

字符 功能
. 匹配任意一个字符(除了\n)
[] 匹配[]中列举的字符
\d 匹配数字0-9
\D 匹配非数字
\s 匹配空白,包括空格和tab键
\S 匹配非空白
\w 匹配单词字符,即a-z,A-Z,0-9,_
\W 匹配非单词字符
import re


ret1 = re.match(r".", "Eamon_稳")
print(ret1.group())

ret2 = re.match(r"[稳a]", "a稳")
print(ret2.group())

ret3 = re.match(r"\w", "_Eamon稳")
print(ret3.group())

运行结果:

E
a
_

匹配多个字符

字符 功能
* 匹配前一个字符出现0或者n次,可有可无
+ 匹配前一个字符出现1次或者无限次,至少1次
匹配前一个字符0或者1次
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现从m到n次

这里和匹配单个字符组合使用:

import re 


ret1 = re.match(r".*", "Eamon_稳")
print(ret1.group())

ret2 = re.match(r"[a-zA-Z0-9]+", "Ae86")
print(ret2.group())

ret3 = re.match(r"_?\w*", "_全部匹配")
print(ret3.group())

运行结果:

Eamon_稳
Ae86
_Eamon全部匹配

可以自由多种组合搭配

匹配开头结尾

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾

匹配分组

字符 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串

eg:当匹配邮箱的时候,可能有163邮箱和126邮箱或qq邮箱,这时候三个都可以匹配:r"\w{4,20}@163|126|qq.com"。为确保没有歧义理解成r"\w{4,20}@163126|qq.com两部分。因此需要加上括号进行分组,以确定范围:r"\w{4,20}@(163|126|qq).com"

import re

ret = re.match(r"\w{4,20}@(163|126|qq)\.com", "[email protected]")
print(ret.group())
print(ret.group(1))

运行结果:

[email protected]
qq

group()括号里加数字代表匹配中的第几个分组,示例中只有一个括号,因此是1。同理可以加多个括号,并且按序取出group(n)的值。

import re


label = "<body><h1>哈哈这是前端的标签</h1></body>"

ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
print(ret.group())
print(ret.group(2))

运行结果:

<body><h1>哈哈这是前端的标签</h1></body>
h1

示例中的数字1,2分别代表分组出现的顺序。当分组过多的时候,可以用名字进行替代(?P),引用的时候(?P=name)。

search

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

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)

findall

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

import re

ret = re.findall(r"d+","python=90, java=95, linux=88")

print(ret)

运行结果:

['90', '95', '88']

sub

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

import re 

ret = re.sub(r"\d+", "100", "bupt=95")

print(ret)

运行结果:

bupt=100

sub支持函数调用

import re 

def add(num):
    strNum = num.group()
    num = int(strNum) + 1
    return str(num)
    
ret = re.sub(r"\d+", add, "bupt=95")

print(ret)

运行结果

bupt=96

split

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

import re 

ret = re.split(r":| ", "info:Eamon bj bupt")

print(ret)

运行结果:

['info', 'Eamon', 'bj', 'bupt']
发布了56 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Dawn510/article/details/100752330
今日推荐