python模块之re

常用正则表达式符号

'.'     默认匹配除
之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","
abc
eee",flags=re.MULTILINE)
'$'     匹配字符结尾,或e.search("foo$","bfoo
sdfsf",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") 是匹配不到的
''    匹配字符结尾,同$
'd'    匹配数字0-9
'D'    匹配非数字
'w'    匹配[A-Za-z0-9]
'W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、	、
、
 , re.search("s+","ab	c1
3").group() 结果 '	'
 
'(?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'}

最常用的匹配语法

1 re.match 从头开始匹配
2 re.search 匹配包含
3 re.findall 把所有匹配到的字符放到以列表中的元素返回
4 re.splitall 以匹配到的字符当做列表分隔符
5 re.sub      匹配字符并替换

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

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

re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
M(MULTILINE): 多行模式,改变'^''$'的行为(参见上图)
S(DOTALL): 点任意匹配模式,改变'.'的行为
 1 import re
 2 
 3 #s = 'hello world'
 4 # print(s.find('ll'))
 5 # ret=s.replace('ll','xx')
 6 # print(ret)
 7 # print(s.split('w'))
 8 # ret=re.findall("ww{2}l", 'hello world')
 9 # print(ret)
10 # ret=re.findall("alex", 'hiudfgiusiohalexlkshd')
11 # print(ret)
12 # .通配符
13 # ret=re.findall("w..l", 'hello world')# . 代指所有字符(换行符除外只能代指一个字符
14 # print(ret)
15 # ^尖角符
16 # ret=re.findall('^h..o','hjasdflhello')#只在开始位置匹配
17 # print(ret)
18 #$
19 # ret=re.findall('h..o$','hjasdflhello')#只在结尾位置匹配
20 # print(ret)
21 # * 重复匹配 范围[0,+oo]
22 # ret= re.findall('a.*li','husihfiosalexlihuidh')
23 # print(ret)
24 # + :[1,+oo]
25 # ret= re.findall('a.+li','husihfiosalexlihuidh')
26 # print(ret)
27 # ? [0,1]
28 # ret= re.findall('a.?li','husihfiosalexlihuidh')
29 # print(ret)
30 
31 # {} 自己定匹配几次 {1,3}匹配一到三次
32 # ret=re.findall('a{5}b','aaaaab')
33 # print(ret)
34 # *等于{0,正无穷}
35 # +等于{1,正无穷}
36 # ?等于{0,1}
37 
38 #字符集
39 
40 #[] 或关系[]中的内容选一,
41 # ret=re.findall('a[c,d]x','acx')
42 # print(ret)
43 #取消元字符的特殊功能(  ^  -例外)
44 # ret=re.findall('a[c,*]x','a*x')
45 # print(ret)
46 # ^放在[]:取反
47 # ret=re.findall('[^4,5]','ysdgufi4x245df')
48 # print(ret)
49 #   反斜杠后跟元字符去除特殊功能
50 #    反斜杠后跟普通字符实现特殊功能
51 # d 匹配任何十进制数;相当于[0-9]
52 # D 匹配任何非数字字符;相当于[^0-9]
53 # s 匹配任何空白字符;相当于[	

fv]
54 # S 匹配任何非空白字符;相当于[^	
fv]
55 # w 匹配任何字母数字字符;相当于[a-zA-Z0-9]
56 # W 匹配任何非字母数字字符;相当于[^a-zA-Z0-9]
57 #  匹配一个单词边界;也就是指单词和空格间的位置
58 # print(re.findall('d{10}','9074892365982475896245692835'))
59 # print(re.findall('sasd','fak asd'))
60 # print(re.findall('w','fak asd'))
61 # print(re.findall(r'I','I am a LIST'))
62 #匹配出第一个满足条件的结果
63 # ret=re.search('sb','shukdsbjfhsb')
64 # print(ret.group())
65 
66 # ret=re.findall(r"\.","sdyfjD\c")
67 # print(ret)
68 
69 # () | 分组
70 # ret=re.search('(as)+','sdfghjasas').group()
71 # print(ret)
72 # print(re.search('(as)|3','as').group())
73 
74 #正则表达式的方法
75 # 1 findall() 所有结果都返回
76 # 2 search()  返回匹配到的第一个对象,对象可调用group()
77 # 3 match()   只在字符串开始匹配,返回匹配到的第一个对象,对象可调用group()
78 # 4 split('[a,b]')  先以a分 分完之后以b分
79 # 5 sub()  三个参数 第一个为原内容 第二个是要替换内容 第三个为替换后的内容
80 # 6 compile()  创建一个正则表达式对象,加入规则。 obj=re.compile() obj.split()
View Code
原文地址:https://www.cnblogs.com/leesen934/p/7787312.html