python 正则表达式相关知识

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]")

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值