专栏首页未闻Code一日一技:在 Python 正则表达式模块中逃跑(escape)

一日一技:在 Python 正则表达式模块中逃跑(escape)

在编程语言中,有常见的符号被赋予了特殊的意义,例如小数点.,在正则表达式里面表示任意一个非换行符的字符;小于号<在 html 中表示标签。

但有时候,我们只想让这些符号表示它本来的意思,不想让它的特殊意义表露出来,应该怎么办?

我们知道,在正则表达式中可以使用反斜杠来让一个特殊符号变成普通符号,例如\.表示普通的小数点,\$表示普通的美元符号。

现在我有一个列表keywords_list,里面是100个字符串,我想判断是否有任意一个字符串在某个给定的句子中。如果用 for 循环一个一个去检查,效率非常低。于是可以考虑使用正则表达式:

import re

pattern = re.compile('|'.join(keywords_list))

if pattern.search('目标句子'):
    print('目标句子中包含某个关键词')

但假设 keywords_list列表中有如下的字符串:

keywords_list = ['4.5', '+{d', '***']

那么我们使用正则表达式就会导致报错,如下图所示。

这是因为这些字符串里面存在特殊的符号,这些符号在正则表达式里面有特殊的意义,有使用的规范,不能随意使用。

但是,keywords_list里面有各种各样的特殊符号,难道要一个一个取出来,逐一x.replace('+', '\+').replace('.', '\.').replace('*', '\*')...?

当然不用,Python 的正则表达式模块已经帮你想好了解决办法,使用re.escape就能自动处理所有的特殊符号了!

它的用法如下:

>>> import re
>>> keywords_list = ['4.5', '+{d', '***']
>>> pattern_str = '|'.join(keywords_list)
>>> safe_pattern_str = re.escape(pattern_str)
>>> print(safe_pattern_str)
4\.5\|\+\{d\|\*\*\*
>>> re.compile(safe_pattern_str)
re.compile('4\\.5\\|\\+\\{d\\|\\*\\*\\*')
>>>

运行效果如下图所示:

解决问题。

本文分享自微信公众号 - 未闻Code(itskingname),作者:kingname

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么Python代码能运行但是PyCharm给我画红线?

    PyCharm在遇到模块找不到时,会使用红色波浪线提醒开发者。这本来是一个非常好的功能,但却由于另外一个问题,会给一些Python初学者造成困扰。

    青南
  • 一日一技:一次性把字符串用多个分隔符分割

    现在有一个字符串: name,age,我们想把它分割为 name和 age,我们可以使用 split()方法:

    青南
  • 一日一技:为什么Python中“2==2&gt;1”结果为True

    为什么会出现 2==2>1的结果为True?如果说这是运算符的优先级问题,那么后两个式子为什么又都是False?

    青南
  • 在Flask中使用ajax的POST方法传递数组

    如果在服务器端使用flask中的request.form.get方法是无法获取到数据的,因为我们传递的是数组,而不是单个元素。 怎么办? flask还提供了...

    用户2936342
  • 顺序表的算法

    顺序表 要点 顺序表是在计算机内存中以数组的形式保存的线性表,是指使用一组地址连续的存储单元依次存储数据元素的线性结构。 顺序表的存储结构可表示如下: ...

    静默虚空
  • 浅谈前端优化技巧

        HTML结构中主要包括了head和body两个部分,但是我们经常说的是结构语义化主要是body中的标签,但是我在这里还是简单的说一下head,head中...

    江米小枣
  • Kubernetes控制器--副本集ReplicaSet

    Kubernetes最核心的功能就是编排,而编排操作都是依靠控制器对象来完成的,高级的控制器对象控制基础的控制器对象,基础的控制器对象再去控制Pod,Pod里面...

    KevinYan
  • rhel7.2 yum使用CentOS 的更新包

    redhat 的更新包只对注册的用户生效,所以我们自己手动更改成CentOS 的更新包,CentOS几乎和redhat是一样的,所以无需担心软件包是否可安装,安...

    孙杰
  • python第十二周:MySql

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据...

    py3study
  • 高并发场景下缓存+数据库双写不一致问题分析与解决方案设计

    Redis是企业级系统高并发、高可用架构中非常重要的一个环节。Redis主要解决了关系型数据库并发量低的问题,有助于缓解关系型数据库在高并发场景下的压力,提高系...

    编程大道

扫码关注云+社区

领取腾讯云代金券