python正则表达式元字符用法_Python正则表达式中元字符的转义处理

本文讨论了在Python中使用正则表达式替换文本时遇到的问题,特别是当关键词包含元字符时。文章解释了元字符如何影响匹配,并提供了一个函数`escape_metachar`来自动转义关键词中的元字符。最后,提醒读者Python的内置函数`re.escape`可以更简洁地完成相同任务。
摘要由CSDN通过智能技术生成

当你在Python代码中尝试生成正则表达式,一定会遇到这个问题。

(正确答案请直接看最下面黑体字→_→)

假设我们要将一段文本text中的某个关键词keyword替换为repl,因为某些原因不能使用str.replace而需要用到正则表达式,比如只替换keyword位于行首的情况,那可以用下面的代码:

re.sub('^' + keyword, repl, text)

多数时候它能正常工作:

>>>text = 'Result: 42'

>>>keyword = 'Result:'

>>>repl = 'The answer is'

>>>re.sub('^' + keyword, repl, text)

'The answer is 42'

但是当keyword稍微发生一点变化:

>>>text = '[Result] 42'

>>>keyword = '[Result]'

>>>repl = 'The answer is'

>>>re.sub('^' + keyword, repl, text)

'[Result] 42'

代码不工作了!

在这个简单例子里,很容易发现问题所在——在我们构造的正则表达式'^[Result]'中,包含了特殊字符方括号,它们是Python正则表达式中的元字符(metacharacter),含义是匹配括号内的任意一个字符。所以'^[Result]'可以匹配字符串'R...'或者'e...',但不能匹配例子中的'[Result]...'。

如何解决?简单,将元字符转义即可:

>>>text = '[Result] 42'

>>>keyword = '\[Result\]'

>>>repl = 'The answer is'

>>>re.sub('^' + keyword, repl, text)

'The answer is 42'

问题在于,keyword通常并非在代码中定义,而是在别处传入或者检测出的,所以我们需要代码自动检测字符串中的元字符,并在每个元字符前面插入转义符号'\'。

一个能够完成这项工作的函数:

def escape_metachar(s):

METACHARS = r'.^$*+?{}[]\|()'

ret = ''

for i, c in enumerate(s):

if c in METACHARS:

ret += '\\'

ret += c

return ret

太丑了,为什么不用正则表达式来做呢。

def escape_metachar(s):

METACHARS = r'.^$*+?{}[]\|()'

meta_esc = re.sub('(?P.)', r'\\\g', METACHARS)

return re.sub('(?P[%s])' % meta_esc, r'\\\g', s)

re.sub有个特殊语法,即'\g'可以引用正则表达式'(?Ppattern)'中匹配到的pattern。上面的代码里,首先在METACHARS中每个字符前面都加个转义,以便在之后的操作中能将其当做普通字符处理,然后在s中查找这些字符,在其前面加转义。

由于第一步跟输入无关,而且METACHARS的定义不太可能发生变化,为了效率起见,写成下面这样更好一点:

def escape_metachar(s):

METACHARS = r'\.\^\$\*\+\?\{\}\[\]\\\|\(\)'

return re.sub('(?P[%s])' % METACHARS, r'\\\g', s)

最后,希望你们不要像我一样,写完代码才发现有库函数re.escape!

写完代码才发现有库函数re.escape!

才发现有库函数re.escape!

有库函数re.escape!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值