re.findall() 查找字符
从字符串中找出符合模式的字符序列:findall(模式(正则表达式),目标字符串)
, 返回值为list类型,list元素为匹配出的各个字符串
如:
import re
a = "java|python12988"
b = re.findall("java", a)
c = re.findall("\d",a)
print(b,c)
结果
['java'] ['1', '2', '9', '8', '8']
findall()
函数还有第三个参数匹配模式,使用多个模式可以用'|'
将各个模式分开,并且所有模式可以同时生效
如re.I
:
import re
language = "PythonC#JavaPHP"
r = re.findall('c#', language)
print(r)
结果为
[]
默认情况下区分大小写,所以'c#'
并不能匹配出原字符串中的'C#'
编辑第三个参数为re.I
,使得匹配不受字母大小写影响
import re
language = "PythonC#JavaPHP"
r = re.findall('c#', language, re.I)
print(r)
结果为
['C#']
如re.S:
import re
language = "PythonC#\nJavaPHP"
r = re.findall('c#.{1}', language, re.I) # "."匹配出除换行符外的所有字符
print(r)
结果为
[]
加上模式re.S,可以改变"."
的行为,将其匹配出换行符
import re
language = "PythonC#\nJavaPHP"
r = re.findall('c#.{1}', language, re.I | re.S) # "."匹配除换行符外的所有字符
print(r)
结果为
['C#\n']
re.sub()正则替换,替换字符
re.sub(要替换的字符,替换后字符,目标字符串,替换个数),返回值为替换后的字符串
如:
import re
language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#','GO',language)
print(r)
结果为
PythonGOJavaGOPHPGO
上例中,替换个数默认为0,加入替换个数参数
如:
import re
language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#','GO',language,count=1)
print(r)
结果为
PythonGOJavaC#PHPC#
结果就只把第一个C#给替换了
效果与python的内置函数replace()
一样
re.sub()的第二个参数也可以传入一个函数
如:
import re
def convert(value):
print(value)
language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#', convert, language)
print(r)
结果为打印出了三个match对象,span表示了匹配到的字符的位置
<_sre.SRE_Match object; span=(6, 8), match='C#'>
<_sre.SRE_Match object; span=(12, 14), match='C#'>
<_sre.SRE_Match object; span=(17, 19), match='C#'>
PythonJavaPHP
说明'C#'
被匹配到了三次,每次都会调用convert
函数,由于该函数没有返回值,所以返回的字符串的'C#'
被去掉了
改写上例,由于value
是个对象,所以可以调用value
的group()
方法获得所要匹配的'C#'
import re
def convert(value):
matched = value.group()
return '!!' + matched + '!!'
language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#', convert, language)
print(r)
结果'C#'
被成功替换成了'!!C#!!'
:
Python!!C#!!Java!!C#!!PHP!!C#!!
由于re.sub()
的第二个参数可以传入一个函数,所以可以对字符串进行各种复杂的操作
例如:
将字符串'ABC24525DEF22698'
中所有小于等于4的数字替换成0,大于4的数字替换成9,就可以编辑convert
函数实现这个功能
import re
def convert(value):
matched = value.group()
if int(matched) <= 4:
return '0'
else:
return '9'
language = 'ABC24525DEF22698'
r = re.sub('\d', convert, language)
print(r)
打印结果为:
ABC00909DEF00999
将函数作为参数传入另一个函数是函数式编程
re.match()和re.search()
re.match()
从字符串的起始位置匹配,若起始位置不符合正则表达式,则返回空
re.search()
搜索整个字符串,返回第一个匹配的结果
两个函数若都能匹配到结果,那么返回的结果也是一个match对象
match对象的方法除了有group()
之外还有span()
方法,可以返回匹配结果的位置
而re.findall()
方法就是把所有的匹配结果返回