1、compile 函数
使用 re.compile 可以将正则表达式的字符串形式编译为一个 Pattern 对象,通过 Pattern 对象提供的一系列方法对文本进行匹配查找,re.compile 单独使用没有任何意义,需要和findall(), search(), match()等搭配使用。 比如:
import re
text = '''
【代号】华法琳
【性别】女
【战斗经验】十年
【出身地】卡兹戴尔
'''
p = re.compile(r'【.*?】') #使用re.compile编写要匹配的规则
p.findall(text) #找出所有【】的内容
#匹配结果为:['【代号】', '【性别】', '【战斗经验】', '【出身地】']
2、 findall 函数
findall() 可以返回文本中所有与Pattern匹配的字符,返回形式为数组。
findall可以有两种方式使用:
re.findall( pattern , text ) #pattern为re.compile编写的pattern对象,text为要进行匹配的文本
pattern.findall(text) #text为要进行匹配的文本
当匹配不到文本时返回空列表。
import re
text = '''新增关卡:GA-ST-1 风云际会、GA-1 灯下黑、GA-2 散步时光、
GA-3 混血儿、GA-TR-1 甜品时间、
GA-4 安魂教堂、GA-5 葬礼、GA-6 安魂曲、GA-7 光与影、GA-8 影与灰、GA-ST-2 鸢尾花'''
p = re.compile(r'(GA-.*?)、') #匹配GA-开始、顿号结束的字符
p.findall(text) #找出所有符合的字符文本
#输出结果为:
['GA-ST-1 风云际会',
'GA-1 灯下黑',
'GA-2 散步时光',
'GA-3 混血儿',
'GA-TR-1 甜品时间',
'GA-4 安魂教堂',
'GA-5 葬礼',
'GA-6 安魂曲',
'GA-7 光与影',
'GA-8 影与灰']
3、match函数 search函数
match()个人觉得比较废,我基本不会用,他的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None。(如果开头第一个字符匹配不到,那直接就返回None了。。)
search()与match()类似,唯一的区别就是search可以不从位置0开始匹配
re.match和re.search匹配成功之后,都是返回一个Object 对象,提供了以下的方法:
- group() 返回匹配的字符串
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span()返回一个元组,包含匹配 (开始,结束) 的位置
import re
#使用match来进行匹配
result = re.match("华法琳","华法琳小姐的道德观念相当淡泊。")
#因为匹配的文本以"华法琳"开头,match可以匹配到,并返回一个对象
if result:
print(result.group())
else:
print("匹配失败!")
#运行结果:华法琳
#使用match来进行匹配
result = re.match("华法琳","每个人都知道华法琳小姐是罗德岛的元老且医术高超。")
#因为匹配的文本没有以"华法琳"开头,match直接返回None
if result:
print(result.group())
else:
print("匹配失败!")
#运行结果:匹配失败!
import re
#使用search进行匹配
p = re.compile(r'血先生')
text = '华法琳小姐的房间中摆放的那些“血先生”参与过的著作,“血先生”正是华法琳小姐。'
#和match不同,即使不以"血先生"开头,search也可以匹配到文本
#同时与findall不同,search只能匹配到一个"血先生"
result = re.search(p,text)
if result:
print(result.group())
else:
print("匹配失败!")
#输出结果为:血先生
4、sub函数
re.sub()用于替换文本中需要替换掉的词语,返回替换后的文本,sub有两种使用方式:
pattern.sub( 替代后的词语 , text )
re.sub(pattern, 替代后的词语 , text )
text = '''虽然,从外表上看阿米娅仅仅是个不成熟的少女,实际上,她却是深受大家信任的合格的领袖。
现在,阿米娅正带领着罗德岛,为了感染者的未来,为了让这片大地挣脱矿石病的阴霾而不懈努力。'''
p = re.compile(r'阿米娅')
result = p.sub('胡桃',text)
#等价于result = re.sub(p,'胡桃',text)
print(result)
#结果:'虽然,从外表上看胡桃仅仅是个不成熟的少女,实际上,她却是深受大家信任的合格的领袖。\n
#现在,胡桃正带领着罗德岛,为了感染者的未来,为了让这片大地挣脱矿石病的阴霾而不懈努力。'
5、split函数
split能够按照所能匹配的字串将字符串进行切分,返回切分后的字符串列表,split也是有两种使用方式:
pattern.split( text )
re.split(pattern, text )
import re
text = '''虽然,从外表上看阿米娅仅仅是个不成熟的少女,实际上,她却是深受大家信任的合格的领袖。
现在,阿米娅正带领着罗德岛,为了感染者的未来,为了让这片大地挣脱矿石病的阴霾而不懈努力。'''
p = re.compile(r'阿米娅')
p.split(text)
#等价于:re.split(p,text)
#输出:
#['虽然,从外表上看',
#'仅仅是个不成熟的少女,实际上,她却是深受大家信任的合格的领袖。\n现在,',
#'正带领着罗德岛,为了感染者的未来,为了让这片大地挣脱矿石病的阴霾而不懈努力。']
表达式字符含义:
与多种字符匹配的表达式
/d 任意一个数字,0~9之中的任意一个数字 ,/D 匹配所有非数字字符
/w 任意一个字母或数字或下划线,也可以是中文, /W 匹配所有非数字字符下划线的字符
/s 包括空格、制表符、换页符等空白字符的其中任意一个,/S 匹配所有非空白字符
. 小数点可以匹配除了换行符(/n)以外的任意一个字符
匹配多种字符的表达式
[aA1@] 匹配 "a" 或 "A" 或 "1" 或 "@"
[^abc] 匹配 "a","b","c" 之外的任意一个字符
[f-k] 匹配 "f"~"k" 之间的任意一个字母
[^A-C0-3] 匹配 "A"~"C","0"~"3" 之外的任意一个字符
修饰匹配次数的符号
{n} 表达式重复n次,比如:"/w{2}" 相当于 "/w/w";"a{5}" 相当于 "aaaaa"
{x,y} 表达式至少重复m次,最多重复n次,比如:"ab{1,3}"可以匹配 "ab"或"abb"或"abbb"
{m,} 表达式至少重复m次,比如:"/w/d{2,}"可以匹配 "a12","_456","M12344"...
? 匹配表达式0次或者1次,相当于 {0,1}
'+' 表达式至少出现1次,相当于 {1,}.
* 表达式不出现或出现任意次,相当于 {0,}
特殊符号
^ 与字符串开始的地方匹配,不匹配任何字符
$ 与字符串结束的地方匹配,不匹配任何字符
/b 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符, /B 匹配非单词边界
| 表示 "或" 关系,a|b 表示a或者b
() 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰;取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
其他:
在线正则表达式测试网站:https://regex101.com/
匹配中文:re.compile(r"[\u4e00-\u9fa5]")