Python之正则表达式-基础篇

一、概念

正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要格式的句子。简单的讲就是按照某种规则去匹配符合条件的字符串


二、常见语法

1、字符相关

示例1:zlw匹配文本中的zlw
import re

# 给定的文本
text = "sjaifhsfafizlw"
res_list = re.findall('zlw', text)
print(res_list)  # 输出['zlw']

示例2:[zlw]匹配文本中的z或l或w
import re

# 给定的文本
text = "sjaifhsfafizlw3133"
res_list = re.findall('[zlw]', text)
print(res_list)  # 输出['z', 'l', 'w']

 示例3:[^zlw]匹配除了zlw以外的其它字符
import re

# 给定的文本
text = "sjaifafizlw31"
res_list = re.findall('[^zlw]', text)
print(res_list)  # 输出['s', 'j', 'a', 'i', 'f', 'a', 'f', 'i', '3', '1']

示例4:[a-z]匹配a-z的任意字符
import re

# 给定的文本
text = "sjaafizlw31"
res_list = re.findall('[a-z]', text)
print(res_list)  # 输出['s', 'j', 'a', 'a', 'f', 'i', 'z', 'l', 'w']

示例5:[0-9]匹配0-9的任意数字
import re

# 给定的文本
text = "s1jaa0fizlw31"
res_list = re.findall('[0-9]', text)
print(res_list)  # 输出['1', '0', '3', '1']

示例6: . 表示匹配除了换行符任意的单个字符

.* 表示匹配任意单个字符后面可以是0/多个字符

.+表示匹配任意单个字符后面可以是1/多个字符

import re

# 给定的文本
text = "s1jaa0fizlw31"
res_list = re.findall('z.', text)
print(res_list)  # 输出['zl']
import re

# 给定的文本
text = "s1jaa0fizlesw31lsw"
res_list = re.findall('z.+w', text) #贪婪模式
print(res_list)  # ['zlesw31lsw'] 
import re

# 给定的文本
text = "s1jaa0fizlesw31lsw"
res_list = re.findall('z.+?w', text) #非贪婪模式
print(res_list)  # ['zlesw'] 

示例7:\w代指字母或数字或下划线(汉字)
import re

# 给定的文本
text = "北京xyz 上海abc 北京mnu"
res_list = re.findall("北京\w", text)
print(res_list)  # ['北京x', '北京m']
示例8:\d代指数字
import re

# 给定的文本
text = "x8dkfjx9jfksdk9dsx1"
res_list = re.findall("x\d", text)
print(res_list)  # ['x8', 'x9', 'x1']

示例9: \s 代指任意的空白符,包括空格、制表符等
import re

# 给定的文本
text = "zlw123d jyy232d zlw323v"
res_list = re.findall("d\s.", text)
print(res_list)  # ['d j', 'd z']

2、数量相关

示例1: * 表示重复0次或更多次
import re

# 给定的文本
text = "你是一个人,你是一个好人"
res_list = re.findall("个*人", text)
print(res_list)  # ['个人', '人']

示例2: + 重复1次或更多次
import re

# 给定的文本
text = "你是一个人,你是一个好人,你是一个大好人"
res_list = re.findall("个\w+人", text)
print(res_list)  # ['个好人', '个大好人']

示例3: ?重复0次或1次
import re

# 给定的文本
text = "你是一个人,你是一个好人,你是一个大好人"
res_list = re.findall("个\w?人", text)
print(res_list)  # ['个人', '个好人']

示例4: {n}表示重复n次

{n,}表示之前的字符至少出现n次

{m,n}表示之前的字符出现次数大于m次,小于n次

import re

# 给定的文本
text = "12674767362,邮箱49374934@qq.com,4793437"
res_list = re.findall("\d{10,15}", text)
print(res_list)  # ['12674767362']
import re

# 给定的文本
text = "12674767362,邮箱49374934@qq.com,4793437"
res_list = re.findall("\d{11}", text)
print(res_list)  # ['12674767362']

3、括号(分组)

示例1:提取数据区域(输出括号里面的内容)

如果是多个括号分成多组

import re

# 给定的文本
text = "12674767362,邮箱49374934@qq.com,4793437"
res_list = re.findall("(12674(\d{4}))", text)
print(res_list)  # [('126747673', '7673')]
import re

# 给定的文本
text = "12674767362,邮箱49374934@qq.com,4793437"
res_list = re.findall("(12674(\d{4}))", text)
print(res_list)  # [('126747673', '7673')]

示例2:获取指定区域+或条件
import re

# 给定的文本
text = "1267476jyy7362,1267476zlw7362"
res_list = re.findall("1267476(j\w{2}|z\w{2})", text)
print(res_list)  # ['jyy', 'zlw']

4、起始和结束 

^ 表示开始

$ 表示结束

一般用于字符的校验

import re

# 给定的文本
text = "abc1267476jyy7362,mnb1267476zlw7362"
res_list = re.findall("^\d.*", text)
print(res_list)  # [] 匹配不到返回为空
import re

# 给定的文本
text = "1267476jyy7362,mnb1267476zlw"
res_list = re.findall(".*\d$", text)
print(res_list)  # [] 匹配不到返回为空

由于正则表达式中*  .  \  {  } (  )等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义
 

import re

# 给定的文本
text = "我有{5}元钱"
res_list = re.findall("有{5}元", text)
print(res_list)  # [] 匹配不到返回为空

转义之后

import re

# 给定的文本
text = "我有{5}元钱"
res_list = re.findall("有\{5\}元", text)
print(res_list)  # ['有{5}元']

5、python中的re模块 

1、findall,获取匹配到的所有数据

import re

# 给定的文本
text = "zbcdefgxyzxmn891235"
res_list = re.findall("x.", text)
print(res_list)  # ['xy', 'xm']

2、match,从起始位置开始匹配,匹配成功返回一个对象,未见配成功返回None

import re

# 给定的文本
text = "zbcdefgxyzxmn891235"
res = re.match("x.", text)
print(res_list)  # None

3、search,浏览整个字符串去匹配第一个,未匹配成功返回None

import re

# 给定的文本
text = "zbcdefgxyzxmn891235"
obj = re.search("x.", text)
res = obj.group()

print(res)  # xy

4、sub,替换匹配成功的位置

import re

# 给定的文本
text = "zbcdefgxyzxmn891235"
res = re.sub("x.", "99", text)

print(res)  # zbcdefg99z99n891235

5、split,根据匹配成功的位置分割

import re

# 给定的文本
text = "zbcdefgxyzxmn891235"
res = re.split("x.",  text)

print(res)  # ['zbcdefg', 'z', 'n891235']

最后给大家安利一个正则表达式匹配工具,非常好用-regex101: build, test, and debug regexRegular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET, Rust.icon-default.png?t=N7T8https://regex101.com/ 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值