Python学习笔记-2017.5.4thon学习笔记-2017.8.16

#正则表达式做字符串匹配
import re
#基本匹配
a = re.match("inet", "inet 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")
print(a)#match是从头开始匹配,如果写192,那就无法匹配
#如果想看匹配到了哪些
print(a.group())#这属于静态匹配
#动态匹配
a = re.match("\w", "inet 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")
print(a.group())
b = re.match("\w+", "inet 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")
print(b.group())
c = re.match("\w?", "inet 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")
print(c.group())



"""
匹配字符
. 匹配除\n之外的任意字符,包括特殊字符
w 不匹配特殊字符,但匹配任意A-Z,a-z,0-9
+ 匹配前一字符一次或多次
^ 匹配字符开头,如果在re.match中使用,没有意义,因为re.match本身就是匹配开头
* 匹配前边的规则0次或者多次,可以匹配不到。
b = re.match("\w+", "!inet 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")
上面的例子,w无法匹配!,因此后面的+无法匹配1次,a.group会报错
b = re.match("\w*", "inet 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")
上面的例子,w无法匹配!,因此后面的*可以匹配0次,a.group不会报错,只会是空的。
? 匹配前一个字符一次或者0次,可以匹配不到。
{m} 匹配前一个字符M次,不用相同的字符,比如可以是int,这就是三次,从第一个字符开始
{n,m} 匹配前一个字符串,最少n次,最多m次,如果超过实际,则会报错,比如inet,写{5,8},会报错,5超过了最大的实际长度
{1,8}则不报错
| 匹配|左侧或者|右侧的字符
b = re.match("inet|INET", "!inet 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")可以匹配成功
b = re.match("inet1|inet2", "!inet 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")匹配失败
(...)分组匹配
b = re.search("(\d{2})(\d{3})", "372321198508105357")按组匹配,从结果中取值,如果把{2}写在括号外,会只打印\d的最后一个值
print(b.groups())
\A 匹配开头
\Z 匹配到结尾
\D 匹配非数字
\d 匹配数字
W 匹配非A-Z,a-z,0-9
s 匹配空白字符,\t \n \r等

分组匹配
re.search("(?P<Province>[0-9]{4})(?P<City>[0-9]{2})(?P<Birthday>[0-9]{4})","372321198508105357").groupdict()
生成字典形式,会打印{"city":81}这种格式

\d{1,3}\.
"""
#不从头开始匹配,而是从对象里面搜索,search只找到
d = re.search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", "inet 地址: 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")
print(d.group())
#优化:
e = re.search("(\d{1,3}\.){3}\d{1,3}", "inet 地址: 192.168.20.118 netmask 0xfffffe00 broadcast 192.168.21.255")
print(e.group())

f = re.findall("\d+", "a5h343egdgdhgds3532535")
print(f)
#以数字为分割点,把字符串分割
f1 = re.findall("\D+", "ah454tssgxfbdfs3t353")
#或者,split会把最后的空格数字写上
f2 = re.split("\d+", "sgewse53tedge664")
#替换
f3 = re.sub("\d+", "|", "dfeed534fegesw335f")#如果需要次数,添加count = *(number)
#可以加入flags,比如flags = re.I,那么匹配时,不区分大小写。
flag = re.M, 匹配多行, 比如re.search("^a", "\nabc\neee", flags=re.M),如果有flags,就忽视\n,可以匹配到结果
flag = re.S, .也可以匹配多行
print(f3)
#反斜杠的困扰,比如匹配的是一个目录格式,以反斜杠分割,后面的目录前边加r是按照字符串处理,不加r会按照语法处理
#四个斜杠代表匹配一个斜杠!
f4 = re.split("\\\\", r"C:\\44\dvd\s35\2d")
print(f4)

 

posted @ 2017-08-16 14:30  万青  阅读(181)  评论(0)    收藏  举报