正则表达式是用来筛选数据的
一种符号匹配一个字符(包括数字、下划线、空格等等)
原子:基本单位,一段或者一个字符
\n | 换行符 | \t | 制表符 |
\w | 字母、数字、下划线 | \W | 除了字母、数字、下划线的其他任一字符 |
\d | 十进制数字 | \D | 除了十进制数字的其他任一字符 |
\s | 匹配一个空格 | \S | 除了空格的其他任一字符 |
. | 匹配任一字符 | ? | 匹配0或1次前面出现的原子 |
^ | 表示开始位置 | $ | 表示结尾位置 |
+ | 匹配1次或1次以上前面出现的原子 | {n} | 前面的原子恰好出现n次 |
{n,} | 前面的原子至少出现n次 | {n,m} | 至少n次,至多m次 |
I | 忽略大小写 | M | 多行匹配 |
用法:
import re
re.search(正则表达式,源字符段数据)
安装re模块,用re.search()在源字符段数据中匹配截取符合正则表达式的字符串数据。
import re
a='dhkajkj23ewiej434421kk'
b='kj\d'
c='kj\d\d'
print(re.search(b,a))
print(re.search(c,a))
这里设置了b和c两个正则表达式,
a:源字符串数据
b:'kj\d',表示寻找一段kj加一个数字的字符段
c:'kj\d\d',表示寻找一段kj加两个数字的字符串
结果如下:
1:在a中找到了kj2,位置在第6个开始,第8个结束
2:在a中找到了kj23,位置在第6个开始,第9个结束
使用re.search().group()函数,则可以把匹配的内容提取出来,上述打印内容就会变成
只有匹配的内容了,十分方便。而且,如果是用括号分开正则表达式匹配了多组数据的话,
group(0):显示全部
group(1):显示第一个括号
group(2):显示第二个括号
以此类推。。。。。。
贪婪模式:使用 * 匹配的是尽量多的数据,但可能不够精确
re.search( 某 * 某,源字符数据)
懒惰:用 *? 表示匹配一次即可
re.search( 某 * ?某,源字符数据)
re.match()与 re.search() 用法很像,只是re.match()从待匹配字符的首个字符开始匹配,而 re.search() 可以从任意位置开始匹配。
模式修正符
I 忽略大小写
M 多行匹配
用法:
re.search(正则表达式,源字符数据,re.I)
re.search(正则表达式,源字符数据,re.M)
全局匹配:
re.compile(正则表达式).findall(源数据)
全局匹配可以匹配出所有满足条件的结果,非常实用!
demo:
把a字符串中的电话号码都提取出来,
import re
a='''座机:021-90989012 地址::上海市浦东新区上海**公司,
座机:0773-7892091 地址:桂林**公司,
座机:0351-7892093 公司地址…'''
b='\d{4}-\d{7}|\d{3}-\d{8}'
c=re.compile(b).findall(a)
print(c)
结果如下:
正则表达式'\d{4}-\d{7}|\d{3}-\d{8}'表示4个数字-7个数字或3个数字-8个数字
再通过全局匹配re.compile().fillall()找出了所有号码。
end......