Python(正则表达式)

正则表达式  re
用于处理 内容比较多、比较复杂的字符串 的一种工具
在表达式中,定义一些规则 ,在大的字符串当中,来筛选出符合规则的子字符串

方法
match()
尝试从字符串的起始位置匹配一个模式,匹配成功则返回的是一个匹配对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话,match()返回的是空
search()  
扫描整个字符串,匹配成功则返回的是一个匹配对象(这个对象包含了我们匹配的信息)
注意:search也只能匹配到一个,找到符合规则的就返回,不会一直往后找
findall()
字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
sub()
类似于replace的替换方法re.sub(正则表达式、替换成什么、要替换的字符串)
split()
切割,跟字符串split,比字符串更加的灵活
[] 表示一个字符的位

贪婪和非贪婪模式
正则默认都是用贪婪模式去匹配数据的,就是尽可能多的匹配符合要求的数据
非贪婪模式下,始终找最短匹配
###### 位数  []里面的规则 匹配的位数
* 用于将前面的模式匹配0次或多次(默认是贪婪模式---> 尽可能多的匹配字符串)
+ 用于将前面的模式匹配1次或多次(默认是贪婪模式)
? 用于将前面的模式匹配0次或1次(默认是贪婪模式)
{m}  用于将前面的模式匹配 m次(默认是贪婪模式)
{m,} 用于将前面的模式匹配 m次或更多次(默认是贪婪模式)
{m,n} 用于将前面的模式匹配 m次到 n次 即最小匹配 m次,最大匹配 n次。 (默认是贪婪模式)

加上问号就是非贪婪模式:
*?  
+?  
??
{m,}?  m次
{m,n}?  m次

#### 判断开头和结尾
^ 用于匹配字符串的开头,match 自动使用这种方法
$ 于匹配字符串的末尾,(如果末尾有换行符 \n,就匹配\n前面的字符),即行尾

#### 预定义字符
"."  用于匹配除换行符(\n)之外的所有字符
\w word 匹配任意数字、字母和下划线

\b boundary  匹配一个单词边界,也就是指单词和空格间的位置。
\d digit 匹配任意的数字   
\s space 匹配任意的空白字符  相对于 \t \n \r
\\ 表示匹配一个 \

\W 非 \w
\B 
\D
\S

# 分组 ---> 在 规则中 使用 () 来表示一个分组
groups()  ----> 所有的组  也可以表示成group(0)
group(1) 第一个分组
"""

练习:

import re

msg1 = "q1werty2uiopa3sdfgh4jklz"  # 筛选出 字符串中 的  字母+数字+字母
result = re.findall("[a-z][0-9][a-z]", msg1)
print(result)

msg2 = "q1WertY2uiopA3Sdfgh4jklz"  # 筛选出 字符串中 的  字母+数字+字母
result1 = re.findall("[a-zA-Z][0-9][a-zA-Z]", msg2)
print(result1)

# 需求  验证一个 QQ号
# 全是数字,不能以0开头,  5-11位
qq = "12345678901"
result2 = re.search("^[1-9][0-9]{4,10}$", qq)
print(result2)

# 需求:验证一个字符串 是否符合  由数字或字母组成,但是不能以数字开头,而且 长度必须 在6位以上
username = "Admin_123"
result = re.match(r"^[a-zA-Z_]\w{5,}$", username)
print(result)

# 需求  提取出 所在的 xx.py 的文件名
msg = "aa.py a*.py ab.txt bb.py cc.png ddddd.py apyb.txt a**.py"
result = re.findall(r"\w+[*]*\.py\b", msg)
print(result)

# 需求: 匹配一个字符串 是否是 手机号
# 11位  第一位  1  第二位 356789 第3位往后 [0-9] 或 \d
phone_num = "16612345678"
result = re.match("^[1][356789]\d{9}$", phone_num)
print(result)

# |
# 匹配数字  0-100
# 0  1 10 11 99 100  01
num = "100"
result = re.match("^[1-9]?[0-9]?$|100$", num)
print(result)

# 验证邮箱   135796@qq.com  karl_go@yeah.net
# 假设 @前面的字符(字母 数字 下划线) 有5-20位
email = 'karl_go@126.com'
#
result = re.match(r"(\w{5,20})@(qq|126|163|yeah)\.(net|cn|com)$", email)
print(result)

# 分组
print(result.groups())  # 显示所有的组的内容
print(result.group(0))  # .group(0) 表示符合规则的整个字符串
print(result.group(1))  # 显示第一组的内容
print(result.group(2))
print(result.group(3))

# 座机号码  022-12345678   0311-1234567  400-1111111
phone_num = "022-12345678"
result = re.match(r"(\d{3,4})-(\d{7,8})$", phone_num)
print(result)
print(result.group(1), result.group(2))

# 提取 html标签 里面的内容
html1 = "<html>hello</html>"
result = re.match(r"<(\w+)>(.+)</\1>$", html1)
print(result)
print(result.group(1))

# 多个标签---> 提取标签名 以及 标签里面的内容
html2 = "<html><h1>hello</h1></html>"
result = re.match(r"<(\w+)><(\w+)>(.+)</\2></\1>", html2)
print(result.group(1))
print(result.group(2))
print(result.group(3))

result = re.match(r"<(?P<n1>\w+)><(?P<n2>\w+)>(.+)</(?P=n2)></(?P=n1)>", html2)
print(result.groups())

# 其他的函数  sub  将 数字 样式的 字符串 进行替换
msg = "java:90,Python:70,C:80"
new_str = re.sub(r"\d+", "100", msg)
print(new_str)


# split()
result = re.split(r"[:,]",msg)
print(result)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值