概念:按指定的规则,对字符串 过滤,提取
作用:
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
代码练习
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就不行了
未完待续。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。