正则表达式学习笔记

在线正则表达式测试 (oschina.net)

常用匹配规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
\w          匹配字母、数字及下划线
\W 匹配不是字母、数字及下划线的字符
\s 匹配任意空白字符,等价于[\t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意数字,等价于[0-9]
\D 匹配任意非数字的字符
\A 匹配字符串开头
\Z 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结尾,如果存在换行,同时还会匹配换行符
\G 匹配最后匹配完成的位置
\n 匹配一一个换行符
\t 匹配一个制表符
^ 匹配一行字符串的开头
$ 匹配一行字符串的结尾
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
[...] 用来表示一组字符, 单独列出,比如[amk]匹配a、 m或k
[^...] 不在[]中的字符,比如[^abc]匹配除了a、b、c之外的字符
* 匹配0个或多个表达式
+ 匹配1个或多个表达式
? 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配n个前面的表达式
{n, m} 匹配n到m次由前面正则表达式定义的片段,贪婪方式
a|b 匹配a或b
() 匹配括号内的表达式,也表示一个组

match

向该方法中传入匹配字符串,该方法会从字符串起始匹配正则,匹配则返回结果,不匹配则返回None。

1
2
3
4
5
6
7
8
#match方法
import re
content = "Hello 123 4567 World_This is a Regex Demo"
print(len(content))
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}',content)
print(result)
print(result.group()) #正则所匹配的内容,匹配到Hello 123 4567 World_This
print(result.span())

匹配目标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#匹配目标
import re
content = "Hello 1234567 World_This is a Regex Demo"
result = re.match('^Hello\s(\d+)\sWorld',content) #(\d+)表示匹配多个数字
print(result)
print(result.group(0))
print(result.span())

#group的表达方式 ()正则把字符串分为三组
import re
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456

通用匹配

1
2
3
4
5
6
7
#通用匹配
import re
content = "Hello 1234567 World_This is a Regex Demo"
result = re.match('^Hello.*Demo$',content) #.*匹配任意,除了换行
print(result)
print(result.group())
print(result.span())

贪婪与非贪婪

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#贪婪
import re
content = "Hello 1234567 World_This is a Regex Demo"
result = re.match('^He.*(\d+).*Demo$',content) #.*贪婪的匹配到了123456
print(result)
print(result.group(1)) # #输出为7
print(result.span())

#匪贪婪
import re
content = "Hello 1234567 World_This is a Regex Demo"
result = re.match('^He.*?(\d+).*Demo$',content) #.*贪婪的匹配到了123456
print(result)
print(result.group(1)) #输出为1234567 .*?匹配0到1个
print(result.span())


#非贪婪
import re
content = "http://127.0.0.1/lala/1.txt"
result = re.match('^http.*?lala/(.*?)',content) #(.*?)没有进行匹配,因为非贪婪尽可能少的匹配
print(result)
print(result.group()) #http://127.0.0.1/lala/
print(result.span())

修饰符

1
2
3
4
5
6
7
8
#修饰符
import re
content = '''Hello 1234567 World_This
is a Regex Demo'''
result = re.match('^He.*?(\d+).*Demo$',content,re.S) #添加re.S就可以匹配换行
print(result)
print(result.group())
print(result.span())

转义字符

1
2
3
4
5
6
7
#转义字符
import re
from unittest import result

content = '(lala)www.lala.com'
result = re.match('\(lala\)www\.lala\.com', content) #加反斜杠匹配.()这几个字符
print(result)

search会一次扫描字符串,直到扫描到匹配的内容,如果扫描完还没有找到,就返回None

1
2
3
4
5
6
7
8
9
#search
import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
result = re.search('Hello.*?(\d+).*?Demo', content)
#result = re.search('Hello.*?(\d+).*?Demo', content)
print(result) #因为match从字符串开始匹配,所以一开头就匹配失败,输出为none
#search输出为
<re.Match object; span=(13, 53), match='Hello 1234567 World_This is a Regex Demo'>

findall

1
findall输出为列表

sub

1
2
3
4
5
#sub()
import re
content = "5645sfgsa6ga1gdGSg5"
content = re.sub('\w+','',content) #用作替换字符
print(content)

compile

1
2
3
4
5
6
7
8
9
10
#compile()
import re
from unittest import result
content1 = '2016-12-15 12:00'
content2 = '2016-12-17 12:55'
content3 = '2016-12-22 13.23'
pattern = re.compile('\d{2}:\d{2}') #使用compile把正则表定义成一个对象。方便替换
result1 = re.sub(pattern,'',content1)
result2 = re.sub(pattern,'',content2)
result3 = re.sub(pattern,'',content3)