Python正则表达式详解

re模块:

    在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re

re模块的使用过程:

# 导入re模块
import re

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

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

re模块示例:

import re

result = re.match("itcast", "itcast.cn")

print(result)

print(result.group())

# 运行结果为:
<re.Match object; span=(0, 6), match='itcast'>
itcast

匹配单个字符:

示例1:.

import re

# .匹配任意一个字符, 除了\n
ret = re.match(".", "M")
print(ret.group())

ret = re.match("t.o", "too")
print(ret.group())

ret = re.match("t.o", "two")
print(ret.group())

# 运行结果为:
M
too
two

示例2:[]

import re

# []匹配[]中列举的字符
# 如果hello的首字符小写, 那么正则表达式需要小写的h
ret = re.match("h", "hello Python")
print(ret.group())

# 大写小写h都可以的情况
ret = re.match("[Hh]", "hello python")
print(ret.group())

ret = re.match("[Hh]", "Hello python")
print(ret.group())

# 匹配0到9的写法
ret = re.match("[0-9]", "5hello python")
print(ret.group())

# 下面这个正则不能匹配到数字4(因为是3-5和5-9), 因此ret为None
ret = re.match("[0-35-9]Hello python", "4Hello python")
# print(ret.group())

# 运行结果为:
h
h
H
5

示例3:\d

import re 

# \d匹配数字, 即0-9
# 使用\d进行匹配,
ret = re.match("嫦娥\d号", "嫦娥1号发射成功")
print(ret.group())

# 运行结果为:
嫦娥一号

示例4:\D

import re

# \D匹配非数字,即不是数字
ret = re.match("\D", "a957")
print(ret.group())

# 运行结果为:
a

示例5:\s

import re

# 匹配空白,即空格,tab键
ret = re.match("\s", " 123")
print(ret.group())

# 运行结果为:
 (空格)

示例6:\S

import re

# 匹配到非空白
ret = re.match("\s", "a  a")
print(ret.group())

# 运行结果为:
a

示例7:\w

import re

# 匹配单词字符,即az,AZ,0-9,_
ret = re.match("\w", "_123")
print(ret.group())

# 运行结果为:
_

示例8:\W

import re

# 匹配非单词字符
ret = match("\W", "$a123")
print(ret.group())

# 运行结果为:
$

匹配多个字符:

示例1:*

import re

# *匹配前一个字符出现0次或者无限次,即可有可无
ret = match("[A-Z]*[a-z]*", "abcABC")
print(ret.group())

# 运行结果为:
abcABC

示例2:+

import re

# +匹配前一个字符出现1次或者无限次,即至少有1次
ret = match("[zo]+", "zozozozozozozo")
print(ret.group())

# 运行结果为:
zozozozozozozo

示例3:?

import re

# 匹配前一个字符出现1次或者0次,即要么1次,要么没有
ret = match("[0-9]?[0-9]", "7")
print(ret.group())

# 运行结果为:
7

示例4:{m}

import re

# 匹配前一个字符出现m次
ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678")
print(ret.group())

# 运行结果为:
12a3g4

示例5:{m, n}

import re

# 匹配前一个字符出现从m到n次
ret = re.match("[a-zA-Z0-9_]{3,6}", "1z2x3c1z2x")
print(ret.group())

# 运行结果为:
1z2x3c

匹配开头结尾:

示例1:$

# 匹配163.com的邮箱地址
import re

email_list = ["haha@163.com", "hehe@163.com", ".com.lili@qq.com"]

for email in email_list:
	ret = re.match("[\w]{4,20}@163\.com$", email)
	if ret:
		print("%s 是符合规定的邮箱地址,匹配后的结果是:%s" % (email, ret.group()))
	else:
		print("%s 不符合要求" % email)

# 运行结果为:
xiaoWang@163.com 是符合规定的邮件地址,匹配后的结果是:xiaoWang@163.com
xiaoWang@163.comheihei 不符合要求
.com.xiaowang@qq.com 不符合要求

match默认从开头匹配,所以不用添加^

匹配分组:

r""的过程:

    由于原始字符串中所有字符直接按照字面意思来使用,不转义特殊字符,故不做“字符串转义”,直接进入第二步“正则转义”,在正则转义中“\”被转义为了“\”,表示该正则式需要匹配一个反斜杠。

示例1:|

import re

# 匹配左右任意一个表达式
ret = re.match("[1-9]?\d$|100", "100")
print(ret.group()) # 100 如果没有|100就只能到99

# 运行结果为:
100

示例2:()

import re

ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@qq.com")
if ret:
	print(ret.group())
	print(ret.group(1))
else:
	print("不是163,126,qq邮箱")
	
# 运行结果为:
qq
test@qq.com

示例3:(?P<name>)(?P=name)

import re

# 分组起别名
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
print(ret.group())
print(ret.group('name1'))
print(ret.group('name2'))

# 运行结果为:
<html><h1>www.itcast.cn</h1></html>
html
h1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值