正则表达式的库在re库里。
findall
re.findall('string ',string S) 匹配字符串,当S中有前面字符串的内容,就返回一个列表,列表包含前面的字符串。
import re
s='hello world'
r=re.findall('hello',s)
print(r)
结果:
元字符:. ^ $ {} * + ? | []
- "." 通配符 只拿除了‘\n \r’即换行和回车不能返回,其他字符串均以单个字符返回。
import re
s='test123\n'
r=re.findall('.',s)
print(r)
结果
如果想拿到‘\n\r’的话,要在findall后面加修饰符‘re.S’
s='test123\n'
r=re.findall('.',s,re.S)//注意加了re.S
print(r)
- ‘^’ 脱字符 ^string 表示匹配该行的字符串是否已string开头,是的话就返回string的列表,不是的话返回空列表。
s='test123\nTest123\ntest'
r=re.findall('^test',s)
print(r)
如果实现多行匹配的话,需要在findall后面加修饰符‘re.M’
s='test123\nTest123\ntest' //注意这里有两个换行,实际上是三行字符串
r=re.findall('^test',s,re.M)
print(r)
如果想不区分大小写的话也需要加修饰符‘re.I’,同时又想多行匹配,所以需要在两个修饰符之间加‘|’分隔开。
s='testing\nTest\ntest'
r=re.findall('^test',s,re.M | re.I)
print(r)
- ‘$’ 结束位置 与^相对, string $表示匹配字符串是否以string结尾,是的话返回string列表,不是返回空列表。
ps:这里的字符串是指包括\n在内的整个字符串,这一点与**^脱字符**不相同。
s='testing\nTest\ntest'
r=re.findall('testing$',s)
print(r)
很明显会返回空列表,因为字符串以‘test’结尾。
如果想实现多行匹配,即将有\n的字符串看成多个字符串的话,需要加修饰符re.M
s='testing\nTest\ntest'
r=re.findall('testing$',s,re.M)
print(r)
- ‘* + ? ’ 这三个一起讲,这三个都是表示匹配次数的。 其中 ‘ * ’表示匹配任意次(0~n);‘+’ 匹配(1 ~ n)次;‘?’
匹配(0~1)次
‘*’的例子
s='z\nzo\nzoo'
r=re.findall('zo*',s,re.M) //注意多行匹配
print(r)
这个代码表示,z开头,紧接着o,但是o出现的次数是任意的,符合这样的标准才会返回到列表里。
‘+’的例子
s='z\nzo\nzoo'
r=re.findall('zo+',s,re.M)
print(r)
‘?’的例子
s='z\nzo\nzoo'
r=re.findall('zo?',s,re.M)
print(r)
注意这里第三个zoo其实也满足要求,但是只会取zo,因为第二个o不满足要求。
这里举个对比的例子
s='z\nzo\nzoo'
r=re.findall('zoo?',s,re.M) //注意这里是zoo?
print(r)
- ‘{}’ 重复元字符 与上面三个类似,是控制匹配表达式次数的
s='z\nzo\nzoo'
r=re.findall('zo{0,}',s,re.M) #与re.findall('zo*',s,re.M)一样
print(r)
r=re.findall('zo{1,}',s,re.M) #与re.findall('zo+',s,re.M)一样
print(r)
r=re.findall('zo{0,1}',s,re.M) #与re.findall('zo?',s,re.M)一样
print(r)
r=re.findall('zo{2}',s,re.M)
print(r)
注意{}里面没有空格!
- ‘[ ]’ 字符组 控制的是匹配内容
会匹配字符串,将里面出现在[]里的内容匹配一下,出现了就返回到列表里。
如果想要匹配[]比如e到o之间的字母,可以在字母之间加‘-’来表示。
如果‘^’放在了[]里面,表示除了[]里面的字母或字符外其他的字母或字符匹配,类似于取反了。
s='test\ntesting\nzoo'
r=re.findall('[eio]',s,re.M)
print(r)
r=re.findall('[e-o]',s,re.M) //efghijklmno
print(r)
r=re.findall('[^eio]',s,re.M)
print(r)
- ‘|’ 选择元字符 它会在|前后的字符串进行匹配,匹配到的返回到列表里。
s='z\nzood\nfood'
r=re.findall('z|food',s,re.M)
print(r)
r=re.findall('[z|f]ood',s,re.M)
print(r)
- ‘()’分组元字符 将()内的表达式定义为组,返回值是()里面整体匹配后的内容,而且只管()里的匹配。
s='z\nzood\nfood'
r=re.findall('[z|f](o*)',s,re.M)
print(r)
不管[z|f]了,只管后面的(o*)
- ‘\’ 转义元字符
如果想取消字符串的转义,需要在字符串前面加r
如果想取消正则语法的转义,需要加\
s=r'z\nzood\nfood' //字符串转义
r=re.findall('[z|f](o\*)',s,re.M) //正则语法转义