Python 正则表达式 学习教程

概念:按指定的规则,对字符串 过滤,提取
在这里插入图片描述
作用:
在这里插入图片描述match() 方法
从字符串起始位置匹配,若失败返回None(后面有也不匹配了,如配数字123qew34,只匹到123)
在这里插入图片描述在这里插入图片描述
flags标志位有下面这些

在这里插入图片描述
**group()**方法 返回当前匹配的字符
span() 返回匹配的范围

import re                      # 导入re模块
s = 'hello python'             # 待宰羔羊
patternmy = 'hello'            # 你的规则
v = re.match(patternmy,s)      # 开始搞
print(v)                          # 输出匹配之后的内容
print(v.group())                  # 返回当前匹配的字符
print(v.span())                   # 返回匹配的范围
print(dir(v))                     # 查看他有哪些方法

大小写这里,要是不区分,flags标志位那里就写 re.I

v = re.match(patternmy,s,re.I)

因为会有不匹配的时候,这时候会报错。加上 if else就会很好

import re
s = 'hello python'
patternmy = 'helloaaaaa'
v = re.match(patternmy,s,re.I)
if v is not None:
    print('匹配成功',v.group())
else:
    print('oh,no...')

常用匹配符

. 点 匹配任意 一个 字符,除了 \n(会返回None)
[ ] 匹配列表中的字符
下图几个“对头”,记住小写即可。大写是相反。。。
其中\s匹配是空白,可以是空格,可以是 \n,可以是 \t
**w**
代码练习

import  re
s = 'a'  # 匹配字母
s = '_'  # 下划线也匹配
s = '\n' #  \n不行,返回None
pattern = '.'
o = re.match(pattern,s)
print(o)

同理同方法,验证其他匹配内容
列表【】的匹配代码
注意也是字符串,加引号‘’哦

import  re
pattern = '[2468]' 
s = '2'
o = re.match(pattern,s)
print(o)

若s = 3或则规则pattern中没2,就返回None.。。。。。废话

匹配手机号码

import  re
pattern =  '\d\d\d\d\d\d\d\d\d\d\d'
s = '18888888888'
o = re.match(pattern,s)
print(o)

运行结果 是匹配的
优化一下:
手机号首位是1,第二位可能是3456789,所以可以这么写

pattern =  '1[3456789]\d\d\d\d\d\d\d\d\d'

利用{} 控制次数
在这里插入图片描述
.* 任意字符,可以有可以没有
上图晦涩,看这个图
在这里插入图片描述上几个示例:
1 *的示例

import  re
pattern =  '\d*'
s1 = '123feqw233fe23'
s2 = 'a12333'
o1 = re.match(pattern,s1)# match()方法,只找到前面的123,后面数字无视啊。。
o2 = re.match(pattern,s2)
print(o1,o2,sep='\n')

运行结果

<re.Match object; span=(0, 3), match='123'>
<re.Match object; span=(0, 0), match=''>   #0个也可,所以返回空,不返回None哦

2 +的示例

import  re
pattern =  '\d+'
s1 = '123feqw233fe23'
s2 = 'a12333'
o1 = re.match(pattern,s1)
o2 = re.match(pattern,s2)
print(o1,o2,sep='\n')

运行结果:

<re.Match object; span=(0, 3), match='123'>
None       # 因为没有,直接返回None。 

3 ?的示例

import  re
pattern =  '\d?'
s1 = '123feqw233fe23'
s2 = 'a12333'
o1 = re.match(pattern,s1)# 
o2 = re.match(pattern,s2)
print(o1,o2,sep='\n')

运行结果:

<re.Match object; span=(0, 1), match='1'>
<re.Match object; span=(0, 0), match=''>

{m} 的示例
就是找到m个匹配。
m大了,如下例找4个,就不行。返回None 。

import  re
pattern =  '\d{3}'   # d{4} 就不行了,返回None
s1 = '123feqw233fe23'
s2 = 'a12333'
o1 = re.match(pattern,s1)#  
o2 = re.match(pattern,s2)
print(o1,o2,sep='\n')

{m,n} 的示例
表示m到n个
上例中大了不行,而这个,n大了,也没关系。
在这里插入图片描述{m,} 的示例
这个表示 至少m个 ,少一个都是None。 示例略。。。。

关于中括号 [ a-zA-Z]匹配,专门研究了下,如代码:

import  re
#pattern0 = '[a-zA-Z][a-zA-Z0-9]*' # 小写大写 小大数
pattern1 = '[A-Z][A-Za-z]*' # 先匹一个大写,然后再匹一个可有可无的大或小写,有大或小就都匹出来,否则结束
pattern2 = '[A-Z][a-z]*'    # 就匹一个大写,然后再匹一个可有可无的小写,有小写就匹,否则结束
s1 = 'AAafA12333a' # 两个大写字母AA
s2 = 'AafA12333a'  
o1 = re.match(pattern1,s1) #   结果是 AAafA
o2 = re.match(pattern2,s1) #   A
o3 = re.match(pattern1,s2) #   Aafa
o4 = re.match(pattern2,s2) #   Aaf
print(o1,o2,o3,o4,sep='\n')

在验证一下结果,完全正确:

<re.Match object; span=(0, 5), match='AAafA'>
<re.Match object; span=(0, 1), match='A'>
<re.Match object; span=(0, 4), match='AafA'>
<re.Match object; span=(0, 3), match='Aaf'>

记住:[ ]中不管几个,就取一个。 要取多个,就要有* +等等。。。

匹配变量 注意里面有下划线哦, 数字不能开头哦
在这里插入图片描述这个可简写成:\w 就相当于字母数字下划线
在这里插入图片描述匹配出 1-99直接的数字
这里不要混了{m,n}这个,这个是次数。。。
\d 是0-9,这里显然不能用0开头

pattern = '[1-9]\d?' #如果用991验证,则返回前两位99

匹配一个秘密 8-20位,大小写 数字 下划线

import  re
pattern = '\w{8,20}'     # 这时候用大括号了
s1 = '12345678#'    # 8个数字加上#井号
s2 = '1234567#'     # 不满足条件不到8个数字加上#井号,
o1 = re.match(pattern,s1)
o2 = re.match(pattern,s2)

print(o1,o2,sep='\n')

运行结果:第一个返回前8个,第二个则返回None

<re.Match object; span=(0, 8), match='12345678'>
None

\n \t的注意:
\n 在字符串里,是换行 \t是Tab空格
在pattern里,也要加\ ,就是\n 来用
例:

import  re
s1 = '\\t123'         
pattern = '\\\\t\d*'    # 需要些4个\\\\ 才行
o1 = re.match(pattern,s1)

print(o1)

边界字符匹配
^ 开头
$ 结尾
\b 一个单词的边界
\B 非单词的边界

$ 结尾匹配的案例

import re
qq = '4543543534@qq.com'
qq2 = '4543543534@qq.com.163.com'
pattern = '[1-9]\d{4,10}@qq.com'
pattern = '[1-9]\d{4,10}@qq.com$'
o = re.match(pattern,qq2)
print(o)

同理 要匹配hello开头就用 ^

pattern = '^hello.*' # .*匹配任意,可以有可以无

\ 在Python中,是转义字符哦,不能单独使用哦,要\
\b 匹配单词的边界 ,不匹配任何字符
左边界
右边界
如下图,\bab 匹配ab为边界的,开头的,所以匹配结果中去了c
如果是aabc就不行了
匹配单词的左边界,\b是代表一个位置代表单词左边,加上右边ab。所以是匹配单词左边界
在这里插入图片描述\b匹配单词右边界的例子,以ab结尾的
在这里插入图片描述会返回None

\B 它匹配非单词的边界
如下图,运行结果,abc能,ab就不行了
在这里插入图片描述

未完待续。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值