正则

'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行

'^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb''ab''a']
'+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab''abb']
'?'     匹配前一个字符1次或0
'{m}'   匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb''ab''abb']
'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c""abcabca456c").group() 结果 abcabca456c
 
 
'\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z'    匹配字符结尾,同$
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
 
'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province''3714''city''81''birthday''1993'}
 
re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.split 以匹配到的字符当做列表分隔符
re.sub      匹配字符并替换

 

反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

 

仅需轻轻知道的几个匹配模式

re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)

M(MULTILINE): 多行模式,改变'^''$'的行为(参见上图)
S(DOTALL): 点任意匹配模式,改变'.'的行为
import re

# re.match()从左开始匹配
a = re.match("inet","inet 地址:192.168.1.123 广播地址:255.255.255.0")
print(a)
# 获取匹配的字符
print(a.group())

# \w匹配一个字符
b = re.match("\w","inet 地址:192.168.1.123 广播地址:255.255.255.0")
print(b.group())#i

# \w+ 匹配多个字符
c = re.match("\w+","inet 地址:192.168.1.123 广播地址:255.255.255.0")
print(c.group())#inet

# 多了个?可以匹配到,也可以匹配不到
d = re.match("\w+?","inet 地址:192.168.1.123 广播地址:255.255.255.0")
print(d.group())

# {3}匹配三个字符
e = re.match("\w{3}","inet 地址:192.168.1.123 广播地址:255.255.255.0")

# 匹配.5到8次,.是默认匹配除\n之外的任意一个字符
f = re.match(".{5,8}","inet 地址:192.168.1.123 广播地址:255.255.255.0")
print(f.group())

# 匹配左或者右
g = re.match("INet|inet","inet 地址:192.168.1.123 广播地址:255.255.255.0")
print(g.group())

h = re.search("(\d{2})(\d{2})(\d{2})(\d{4})","455202199707271213")
print(h.group())#4552021997
print(h.groups())#('45', '52', '02', '1997')

# '(?P<name>...)' 分组匹配
i = re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242")
print(i.groupdict())# 结果{'province': '3714', 'city': '81', 'birthday': '1993'}

# \d{1,3}为匹配数字1到3个,\.表示为.
j = re.search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}","inet 地址:192.168.1.123 广播地址:255.255.255.0")
print(j.group())
# 优化后
k = re.search("(\d{1,3}\.){3}\d{1,3}","inet 地址:192.168.1.123 广播地址:255.255.255.0")
print(k.group())

# 查找所有的数字\d为数字,+是匹配之前的字符
l = re.findall("\d+","abc22j3j5j7k8k2l")#['22', '3', '5', '7', '8', '2']
print(l)
m = re.findall("\D+","abc22j3j5j7k8k2l")#['abc', 'j', 'j', 'j', 'k', 'k', 'l'] D匹配非数字
print(m)
n = re.findall("[a-zA-Z]+","abc22j3j5j7k8k2l")#['abc', 'j', 'j', 'j', 'k', 'k', 'l']
print(n)

o = re.split("\d+","abc22j3j5j7k8k2")#['abc', 'j', 'j', 'j', 'k', 'k', '']
print(o)

# 把数字都替换成|
p = re.sub("\d+","|","abc22j3j5j7k8k2")#abc|j|j|j|k|k|
print(p)
q = re.sub("\d+","|","abc22j3j5j7k8k2",count=4)#aabc|j|j|j|k8k2  后面加上count则表示替换多少次
print(q)

# 四个\代表一个
r = re.split("\\\\",r"D:\cheng\study\python")#['D:', 'cheng', 'study', 'python']
print(r)

# flags=re.I忽略大小写
s = re.split("a","ABC",flags=re.I)#['', 'BC']
print(s)

# flags=re.S 去掉回车\n
t = re.search(".+","\nabc\nnee",flags=re.S)
print(t.group())

 

posted @ 2018-01-05 12:31  雨之愿风  阅读(115)  评论(0编辑  收藏  举报