常用python正则表达式详解

正则表达式:

        是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

1.re模块 - 转义字符和 r前缀

正常情况下我们要打印1111\2222\333" 需要用转义字符写成这样—》str1 ="1111\\2222\\333"

我们用 r前缀  可以增加美观性-》str2 =r"1111\2222\333"

2.常用字符 

1.".":匹配除了\n之外的任意一个字符,re.S模式下可以匹配\n

2."\":转义字符

3."[]":或,选择其中包含的字符进行匹配

4."|":或,选择“|”两边的内容进行匹配

5."*":匹配前一个字符出现0或者多个,即可有可无

6."+":匹配前一个字符出现1或者多个,即至少有1次可以有多次

7."?":非贪婪,匹配前一个字符出现1次或者0次,即要么有1次,要么没有

8."\s":空白字符,包含"tab键,空格,\n"

9."\S":匹配非空白

10."\d":匹配数字,即0-9

11."\D":匹配非数字,即不是数字

12."\w":匹配单词字符,即a-z、A-Z、0-9、_、还可以匹配中文

13."\W":匹配非单词字符

14."{m}":匹配前一个字符出现m次

15."{m,n}":匹配前一个字符出现从m到n次

16."^":匹配字符串开头,[^x]匹配除了x以外的任意字符

17."$":匹配字符串结尾

18."(ab)":将括号中字符作为一个分组

19."\num":引用分组num匹配到的字符串

20."(?P<name>)":分组起别名

21."(?P=name)":引用别名为name分组匹配到的字符串

22.(?=...):匹配...出现在之后的位置 

23.(?<=...): 匹配...出现在 之前 的位置 

3.常用方法

1.re.match(r"匹配条件", "匹配的内容"): 能够匹配出以xxx开头的字符串,默认非贪婪,匹配到符合条件的内容就返回内容,内容为字符串
  
2.ret.group():引用分组中的内容,有(内容)就按1,2进行引用,如果没有,直接引用当前匹配内容,内容为字符串

3.re.search(r"匹配条件", "匹配的内容"):从全局开始开始匹配,如果匹配到符合条件的内容就返回内容,内容为字符串

4.re.findall(r"匹配条件", "匹配的内容"):从全局开始匹配,默认贪婪,会匹配所有符合条件的内容,再返回一个列表

5.re.sub(r"匹配条件", "需要替换的内容", "匹配的内容"):将匹配到的数据进行替换,返回字符串

6.p = re.compile("匹配条件"):可以将条件保存在一个变量中,再以变量.方法的方式进行匹配

 

3.() [] {}的区别

      ()是为了提取匹配字符串的,表达式中有几个(),就有几个相应的匹配字符串。如:(0-9)匹配‘0-9’本身

        [] 是定义匹配的字符范围,如:[a-zA-Z0-9]表示相应位置的字符要匹配英文字符和数字。

        [^] 非,除了范围内的字符,如[^0-9] 表示匹配除了数字外的字符

        {}  一般是用来匹配的长度。

          如:0{11}匹配11个0,0{2,}匹配最少2个0,\d{8,11}最少匹配8个数字,最多匹配11个数字 

4.代码展示:       

  1.用正则和不用正则的区别

import  re
text = "张三今年30岁,身高:168CM," \
      "体重:56kg,身份证号:78978978895548795X," \
      "手机号:12345678911,邮箱:zhang_shan@qq.com"\
      "博客:https://blog.abcd/zhangshan"\
      "公司网址:http://www.zhangshan123.com"
#1.例如我要找到text中是否有张三,不用正则和正则的比较
name = "张三"
if name in text:
      print("有这个人")
else:
      print("没有找到")
 # r 代表原始字符 打印出找到的字符串
 # findall 返回找到的例表。
print(re.findall(r'张三',text))

有这个人
['张三']

  2.找出所有的数字,非数字,出现1次到多次的数字

#2.找出所有的数字,非数字,出现1次到多次的数字
print("匹配所有的数值:",re.findall(r'\d',text))  #\d 匹配所有的数值
print("匹配所有的数值:",re.findall(r'\D',text))  #\D匹配所有的非数字
print("找出所有的连续数字:",re.findall(r'\d+',text))  #\d+ 匹配所有的数值出现1次到多次的数字,+ 代表重复一次或者多次

匹配所有的数值: ['3', '0', '1', '6', '8', '5', '6', '7', '8', '9', '7', '8', '9', '7', '8', '8', '9', '5', '5', '4', '8', '7', '9', '5', '1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '1', '1', '2', '3']
匹配所有的数值: ['张', '三', '今', '年', '岁', ',', '身', '高', ':', 'C', 'M', ',', '体', '重', ':', 'k', 'g', ',', '身', '份', '证', '号', ':', 'X', ',', '手', '机', '号', ':', ',', '邮', '箱', ':', 'z', 'h', 'a', 'n', 'g', '_', 's', 'h', 'a', 'n', '@', 'q', 'q', '.', 'c', 'o', 'm', '博', '客', ':', 'h', 't', 't', 'p', 's', ':', '/', '/', 'b', 'l', 'o', 'g', '.', 'a', 'b', 'c', 'd', '/', 'z', 'h', 'a', 'n', 'g', 's', 'h', 'a', 'n', '公', '司', '网', '址', ':', 'h', 't', 't', 'p', ':', '/', '/', 'w', 'w', 'w', '.', 'z', 'h', 'a', 'n', 'g', 's', 'h', 'a', 'n', '.', 'c', 'o', 'm']
找出所有的连续数字: ['30', '168', '56', '78978978895548795', '12345678911', '123']

  3.找出1开头的手机号

#3.找出1开头的手机号
p = re.compile(r'\b1\d{10}')   #re.compile()匹配的条件 1开头的手机号
pip =p.findall(text)
print("手机号:",pip)

手机号: ['12345678911'] 

4.找出18位身份证号

#4.找出18位身份证号
id = re.findall(r'\d{18}|\d{17}X|x$',text) #$匹配字符串结尾
print("身份证号:",id)

 身份证号: ['78978978895548795X']

 5.找出邮箱

#5.找出邮箱
email = re.findall(r'[a-zA-z0-9_]+@[a-zA-z0-9]+\.[a-zA-z0-9]+',text)
#[a-zA-Z0-9_]匹配任何字母及数字和下划线  [a-z]匹配任何小写字母  + 多次  \. 转义字符  \前面写有r‘ 这里可写可不写 为了美观加上去了
print("邮箱:",email)

邮箱: ['zhang_shan@qq.com'] 

6.找出博客地址

#6.找出博客地址
blog = re.findall(r'[a-z]+://[a-zA-z0-9]+\.[a-z]+/[a-zA-z0-9]+',text)
print("博客地址:",blog)

 博客地址: ['https://blog.abcd/zhangshan']

7.找出网址

#7.找出网址
purl= re.findall(r'[a-z]+://[a-zA-z]+\.[a-zA-z0-9]+\.[a-z]+.[a-z]+',text)
print("网址:",purl)
网址: ['http://www.zhangshan123.com']

8.匹配HTML标签内的内容

#8.匹配HTML标签内的内容
html="<h1>世界那么大我想去看看</h1>"
src ="<img src = https://t7.baidu.com/it/u=3631608752,3069876728&fm=193&f=GIF>"
phtml = re.findall(r'(?<=<h1>).*(?=</h1>)',html)
print("html标签中的内容是:",phtml)
#(?<=...): 匹配...出现在 之前 的位置
#(?=...):匹配...出现在 之后 的位置
psrc =re.findall(r'src\s*=\s*[\'\"]?.*[\'\"]?',src)
print("src地址:",psrc)
#\s*=\s*  匹配 =  前后是否有空格(*为0个以上,包括0)
#[\'\"]?  最小匹配,要么有引号要么没有,  \转义字符
#.* 匹配所有内容

 html标签中的内容是: ['世界那么大我想去看看']
src地址: ['src = https://t7.baidu.com/it/u=3631608752,3069876728&fm=193&f=GIF>']

9.re.sub 替换匹配的数据

#9.re.sub 替换匹配的数据
texts = "GaBc,feaBc,beabc"
result = re.sub(r'abc','***',texts,flags=re.I)
#re.sub(r"匹配条件", "需要替换的内容", "匹配的内容") ,flags=re.I 指定标志位,re.I忽略大小写
print("替换前的字符串",texts)
print("替换后的字符串",result)

替换前的字符串 Gabc,feabc,beabc
替换后的字符串 G***,fe***,be*** 

正则表达式在线测试工具:正则表达式在线测试 | 菜鸟工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看,这都几点了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值