Python基础-正则

本文介绍了Python正则表达式的基础知识,包括元字符的使用,如普通字符、通配符、修饰符等;贪婪和非贪婪模式的区别;预定义字符组的概念;以及常用的正则函数如findall、match和search的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式应用:

  • 判断一个字符串是否匹配给定的格式。如:判断用户注册账号是否满足格式
  • 从一个字符串中按指定格式提取数据。如:抓取页面中的连接
# re.findall(pattern, string)
import re
s1 = 'testing123'
s2 = 'Testing123'
r = re.findall("test", s1)
print(r)   # ['test']
r = re.findall("test", s2)
print(r)  # 拿到空字符

一、元字符

1、普通字符

import re
 s = 'testing123\nTesting123'
 # 1.普通字符:修饰符re.I: 忽略大小写
 r = re.findall('test', s, re.I)
 print(r)   # ['test', 'Test']

2、通配符 .

 2. .通配符:匹配除了“\n" 以外的任何单个字符
 s = 'testing123\nTesting123'
 r = re.findall(".", s)
 print(r)
 # 3. re.S 可以匹配换行符\n
 r = re.findall(".", s, re.S)
 print(r)

3、修饰符^

3.^:匹配输入字符串的开始位置,修饰符re.M多行匹配 OR(|)或 多个修饰符
s = 'testing123\nTesting123\ntest'
print(s)
r = re.findall("^test", s)
r1 = re.findall("^test", s, re.M)            # 多行匹配
r2 = re.findall("^test", s, re.I | re.M)     # 多个修饰符
print(r)
print(r1)
print(r2)

4、$匹配结束位置

4 $:匹配输入字符串的结束位置
s = 'testing123\nTesting123\ntest'

r = re.findall("testing123$", s)      # 必须是结尾 否则为空
pring(r)
r = re.findall("testing123$", s, re.M)  # 多行匹配
pring(r)
r = re.findall("testing123$", s, re.M | re.l) #多个修饰符 
pring(r)

5、*+?匹配次数

# 5 *+?:匹配前面的子表达式任意次/大于等于1次/零次或一次
# 6 {}匹配前面的子表达式
s1 = "z\nzo\nzoo"
r = re.fingdall("zo*", s1)
r1 = re.fingdall("zo{0,}", s1)  从零开始到无穷大
pring(r)                  #'z', 'zo', 'zoo'
r = re.fondall("zo+", s1)
r1 = re.fingdall("zo{1, }", s1)
pring(r)                  #'zo', 'zoo'
r = re.fondall("zo?", s1)
r1 = re.fingdall("zo{0,1}", s1)
pring(r)                   #'z', 'zo', 'zo'

r1 = re.findall("zo{2}", s1)
pring(r1) 

6、[]字符组

# 7 []字符组:内容
s = "test\nTesting\nzoo"
r = re.findall("[oet]", s) # 所有oet 字符
print(r)
r = re.findall("[e-i]", s)  # 范围字母e到i
print(r)
r = re.findall("^[oet]", s)  # 开头只有t
print(r)
r = re.findall("[^oet]", s)  # 除了oet之外的所有字符
print(r)

7、|选择元字符

# |:  选择元字符
s = "z\nzood\nfood"

r = re.findall("z|food", s)  # 匹配z或food
print(r)
r = re.findall("[z|f]ood", s)  # 匹配zood或food
print(r)
r = re.findall("[zf]ood", s)  # 匹配zood或food
print(r)

8、()分组元字符

# ():分组元字符
s = "z\nzood\nfood"

r = re.findall("[zf]o*", s)
print(r)                      # ['z', 'zoo', 'foo']
r = re.findall("[zf](o*)", s)  # 只要括号内的字符
print(r)                      # ['', 'oo', 'oo']

9、\转义元字符

# 字符串的转义
s1 = r"z\nzo\nzoo"
print(s1)
# 转义元字符\
s = "123456@qq.com"
r = re.findall("\.", s)
print(r)

二、贪婪和非贪婪

1、非贪婪模式.*?

尽可能少的匹配字符

s = "abcabdadcaec"
r = re.findall("ab.*?c", s)
print(r)   # ['abc', 'abdadc']

2、贪婪模式.*/.+

尽可能多的匹配字符

s = "abcabdadcaec"
r = re.findall("ab.*c", s) # .* 或者.+ 都是贪婪模式
print(r)  # ['abcabdadcaec']

三、预定义字符组

提前定义好的字符

预定义字符类说明对等字符类
\d任一数字字符[0-9]
\D任一非数字字符[^0-9]
\s任一空白符[\t\n\x0B\f\r]
\S任一非空白符[^\t\n\x0B\f\r]
\w任一字母数字字符[a-zA-Z0-9]
\W任一非字母数字字符[^a-zA-Z0-9]
import re
# \d:[0-9]
s = "<a href='lkjk'>494152494125</a>"
r = re.findall("\d", s)
print(r)
r = re.findall("\d.*\d", s) # 可以取到一起
print(r)                  # ['494152494125']
# \D:[^0-9]
r = re.findall("\D", s)
print(r)
# \s; \S
s = "apgjap*+-*/ aohgn\tkwpog\najgoj"
r = re.findall("\s", s)
print(r)
r = re.findall("\S", s)
print(r)
# \w 字母数字下划线汉字
s = "apg12312412jap*_+-*/ aohgn\tkw你好pog\najgoj"
r = re.findall("\w", s)
print(r)
r = re.findall("\W", s)
print(r)

实际应用

import re
s = "12345231@qq.com"
a = re.findall("^\w+@\w+\.com$", s)
print(a)  #  ['12345231@qq.com']

四、常用函数

1、findall

将匹配到的全部内容放入一个列表返回

import re
s = "Cats are Cat"
r1 = re.findall("C\w+", s)
r2 = re.findall("(C\w+)", s)
r3 = re.findall("C(\w+)", s)
r4 = re.findall("(C)(\w+)", s)
print(r1)  # ['Cats', 'Cat']
print(r2)  # ['Cats', 'Cat']
print(r3)  # ['ats', 'at']
print(r4)  # [('C', 'ats'), ('C', 'at')]

2、match

从头匹配(如果字符串的开始不符合表达式则匹配失败从头匹配(如果字符串的开始不符合表达式则匹配失败)

import re
s = "Cats are Cat"
r = re.match("C\w+", s)    # 只匹配字符串的开头
print(r.group()) # 获取匹配到的值必须要group
r = re.match("(C)(\w+)", s)
print(r.groups()) # 获取匹配到的分组

3、search

会浏览整个字符串但会返回第一个字符串

import re
s = "cats are Cat"
r = re.search("C\w+", s)    # 匹配字符串的开头 如果开头没有则匹配后面有的
print(r.group()) # 获取匹配到的值必须要group
r = re.search("(C)(\w+)", s)
print(r.groups()) # 获取匹配到的分组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值