Python-正则表达式

一.正则表达式
       正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。


1.基本模式
字面模式: 就是字面长量,就代表其本身
  . 匹配任何字符
  \w 匹配一个字母、数字、下划线

  \W 匹配非字母、数字、下划线

  \s 匹配空白  

  \S 匹配非空白字符
  \d 匹配数字
  ^ 开头  

  $ 结尾
  \ 转义字符

wKioL1m1GujziG-tAAA2dmj2oNU022.png


wKiom1m1G5eCDWGNAAA2S0igmNI501.png

元字符:
   [[:digit:]]
   [[:upper:]]
通配符:^,$,[]  , ^和$在[]中不代表以什么开头以什么结尾的意思
   *
   ?
   $,^
   []

2.次数的匹配 , 匹配其前面的字符出现的次数 :
* 0 次或多次
+ 一次或多次
? 零次或一次

{n}              代表重复n次
{m,n}          代表重复m次到n次
{0,}             重复0次到无穷大,*
{1,}             重复1次到无穷大,+
{0,1}           重复0次或一次,?


3.中括号
中括号用于指向一个字符集合
中括号可以使用元字符
中括号中的. 表示其字面意思

[a-z] [A-Z] [0-9] [A-Za-z]

[0-9a-zA-Z\_] 可以匹配一个数字、字母或者下划线;
[0-9a-zA-Z\_]+ 可以匹配至少由一个数字、字母或者下划线组成的字符串;
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19} 更精确地限制了变量的长度是 120个字符;

A|B 可以匹配 A 或 B
^\d 表示必须以数字开头
\d$ 表示必须以数字结束

wKioL1m1G7fSCsN3AAAdouSn8bs405.png


练习: 检验变量名是否合法?

wKiom1m1HFHAozKeAABl4kUvKe0215.png


思考
判断一个字符串是否是合法的 Email 的方法;

判断满足029-1234567这样要求的电话号码的方法;


myre = r"^010-{0,1}\d{8}"    可以写成 myre = r"^010-?\d{8}"

re.findall(myre,s)



二.re 模块
r = r'hello'
re.match(r, 'hello')
re.match(r, 'westos')
match() 方法判断是否匹配,如果匹配成功,返回一个 Match对象,否则返回 None 。


分组
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
m.group(0)
m.group(1)
m.group(2)

wKioL1m1IkjBThUlAAD3zee41NU518.png




贪婪匹配
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')


注:
\d+ 采用贪婪匹配,直接把后面的 0 全部匹配了,结果 0* 只能匹配空字符串



\d+ 采用贪婪匹配,直接把后面的 0 全部匹配了,结果 0* 只能匹配空字符串必须让 \d+ 采用非贪婪匹配(也就是尽可能少匹配),才能把后面的 0 匹配出来,加个 ? 就可以让 \d+ 采用非贪婪匹配


三.编译
当我们在 Python 中使用正则表达式时,re 模块内部会干两件事情:
1. 编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
2. 用编译后的正则表达式去匹配字符串。
重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式。


编译
r = r'hello'
r_compile = r.compile(r)
r_compile .match()


myre = r"^010-?\d{8}"
comR = myre.compile(myre)
re.findall(comR,s)
re.finditer(comR,s)


练习
基础版:有一个日志文件access.log,统计访问前十的 IP 地址和访问次数。
升级版:有多个日志文件access.log,统计访问前十的 IP 地址和访问次数。



四.总结

re.match(p,text) :p 为正则表达式模式, text 要查找的字符串,会返回一个match 对象
re.search(p,text) : 只要在 text 中匹配到了 p 就返回,只返回第一个匹配到的
re.findall(p,text) :将能匹配上的全返回,会返回一个 list
re.split(p,text) : 按照 p 匹配,并且以匹配到的字符为分隔符切割 text, 返回一个切割后的 list(s.split() )

re.sub(p,s,text) : 替换,将 p 匹配到的字符替换为 s.    (相当于s.replace())
pattern = re.compile(p) 先编译 p 模式,当正则表达式模式比较复杂的时候,会先编译,然后再使用





      本文转自一百个小排 51CTO博客,原文链接:http://blog.51cto.com/anfishr/1964142,如需转载请自行联系原作者










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值