正则表达式不包含空格

前言

正则表达式作为一名合格的程序员的必备的基本技术之一,其有用性不言而喻。但是它为什么会非常难以掌握,甚至想用一用也都感觉难以下手呢?本文将会让你一次就看会如何使用Python正则表达式。

1. 正则表达式的组成

在介绍如何使用Python的正则表达式时,我们需要先认识一下正则表达式的各种功能,以及其组成形式如何。

正则表达式可以从非结构化的文本中提取到我们想要的内容,其本质为模式匹配,也是体现出智能化的最初手段,现在已经广泛应用于自动化处理信息的流程之中,从爬虫到人工智能,无处不在,其需求也是相当的大。

一提及正则表达式的编写,在N多的博客里都提到了一个神奇的网站http://www.txt2re.com/,这个网站我之前也用过,如果你不会正则表达式,又想偷懒自动生成,你只需要在这个网站里复制粘贴一个最复杂的情况,然后把你想匹配的内容通过可视化的点击组合就可以自动生成你想要的正则表达式。

但是遗憾的是,这个网站目前已经打不开了。这也正是告诉我们,核心技术掌握在自己手里才是真啊。现在我们来看看正则表达式该如何编写。下面是使用进行正则表达式的一般流程,不同的语言其实现方法不完全相同,我们今天主要聚焦与使用python进行正则表达式的三种匹配方式,以获得我们想要的目标片段,对于其他方法,我们以后再进行讲解。

首先确定你的输入的大致格式

在这个输入的大致格式中定位到你需要的内容,以及你不需要的内容。

通过正则表达式将其匹配出来

抽取其临时的结果将其保存到我们需要的数据结构中

2. 使用python表示正则表达式流程

如果我们使用python进行一个正则表达式正则时,我们主要经历一下几个步骤:

导入包

根据需求指定正则表达式

编译自定义的表达式

根据其表达式进行匹配

输出结果

1,3,5都是相对容易的部分,而其中最难的部分主要有两步,一个是制定一个符合需求的正则表达式,另一个则是如何进行匹配。我们最后会简单的介绍一下输出结果。

3. 编写正则表达式

编写正则表达式是其中的核心,如何编写正确的,符合我们想法的表达式呢?我们这里介绍下面两个部分进行构建:

原封不动的单词

这一部分并不是我们需要的,只是一些留存在我们需要的内容中间的部分。原封不动的单词就原封不动的抄写上去,不要增加格外的形式。

待匹配的部分

这一部分使我们想抽取出的内容,将我们想匹配的部分使用正则表达式进行表达分为两个部分,一个部分为我们的匹配的字符,例如:

\w 匹配字母数字及下划线 \W 匹配非字母数字及下划线 \s 匹配任意空白字符,等价于 [\t\n\r\f]. \S 匹配任意非空字符 \d 匹配任意数字,等价于 [0-9]. \D 匹配任意非数字 \A 匹配字符串开始 \Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 \z 匹配字符串结束 \G 匹配最后匹配完成的位置。 \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 \B 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 \n, \t, 等. 匹配一个换行符。匹配一个制表符。等 \1…\9 匹配第n个分组的内容。 \10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 另一种,则是匹配的模式,决定我们如何进行匹配: ^ 匹配字符串的开头 $ 匹配字符串的末尾。 . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 […] 用来表示一组字符,单独列出: 匹配 ‘a’,‘m’或’k’ [^…] 不在中的字符:[^abc] 匹配除了a,b,c之外的字符。 re* 匹配0个或多个的表达式。 re+ 匹配1个或多个的表达式。 re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 re{ n} 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的两个 o。 re{ n,} 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。“o{1,}” 等价于 “o+”。“o{0,}” 则等价于 “o*”。 re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 a| b 匹配a或b (re) 对正则表达式分组并记住匹配的文本 (?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 (?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 (?: re) 类似 (…), 但是不表示一个组 (?imx: re) 在括号中使用i, m, 或 x 可选标志 (?-imx: re) 在括号中不使用i, m, 或 x 可选标志 (?#…) 注释. (?= re) 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 (?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 (?> re) 匹配的独立模式,省去回溯。

两者搭配即可完成我们想要的结果,虽然这里列举了很多,但是我们常用的就那几个,正则表达式的简单划分将正则表达式划分为元字符、反义、量词和懒惰限定词。我会在后面的部分给出一个实例。当我们的正则表达式撰写完毕后,我们使用下面的函数获得我们的匹配模板。

re.compile(pattern[, flags])

4. 匹配的方式

正则表达式匹配的方式主要有3种match, search和findall。如果你懂英语的话,就知道它们的区别,这里前两个都是单一匹配,只会匹配一个流程,如果有多个符合匹配规则的,它们只会返回第一个结果,而findall会把所有符合候选的都匹配出来。而前两个的区别就是match必须是开头就要能够匹配,也就是和startwith差不多的效果,而search则可以在任意位置进行匹配。

下面看一下三个方法的参数表示,其中pattern为我们制定的正则表达式,string为我们要匹配的字符串,flags表示匹配模式:

re.match(pattern, string, flags=0) re.search(pattern, string, flags=0) findall(string[, pos[, endpos]])

因此我们选择方式时有以下几个步骤:

是否需要匹配多个?是,选择findall

是否需要从头匹配?是,选择match

一般情况使用search

5. 匹配结果展示

匹配结果展示主要有以下四个部分组成:

group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0); start() 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0; end() 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0; span() 方法返回 (start(group), end(group))。

例如下面这个例子,主要表现了我们如何调用这四个部分。 >>>import re >>> pattern = re.compile(r'\d+') # 用于匹配至少一个数字 >>> m = pattern.match('one12twothree34four') # 查找头部,没有匹配 >>> print m None >>> m = pattern.match('one12twothree34four', 2, 10) 39;e'的位置开始匹配,没有匹配 >>> print m None >>> m = pattern.match('one12twothree34four', 3, 10) 39;1'的位置开始匹配,正好匹配 >>> print m # 返回一个 Match 对象 <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) 39;12' >>> m.start(0) # 可省略 0 3 >>> m.end(0) # 可省略 0 5 >>> m.span(0) # 可省略 0 (3, 5)

6. 举一个简单的例子

一个更好的,更直观易懂的方法是如下这个例子,相比较刚才使用数字索引,它将每一个匹配内容语义化,使得代码更加容易理解。 contactInfo = ' ( Nucleus (span 2 3) (rel2par span)' pattern=re.compile(r'(?P<nuclearity>\w+) \(span (?P<start>\w+) (?P<end>\w+)\) \(rel2par (?P<relation>\w+)\)') match = pattern.search(contactInfo) print(match.group()) 34;nuclearity")) 34;start")) 34;end")) 34;relation")) # span

从上述的例子中我们就可以获得最直观的结果,我们只需要将这些结果存入到我们需要的数据结构中即可。

7. 其他一些补充知识

7.1 匹配常用的一些格式

如果我们只需要匹配一些常用的格式,如姓名、身份证、邮箱、电话号码等,都是有现成的工具直接生成,不需要我们进行再次编写。

7.2 匹配中文字符

如果你只是想匹配若干个中文汉字,使用下面的正则表达式:

[\u4E00-\u9FA5\\s]+ 多个汉字,包括空格 [\u4E00-\u9FA5]+ 多个汉字,不包括空格 [\u4E00-\u9FA5] 一个汉字

这里还有匹配更全的中文字的方法。

提到用正则表达式匹配汉字,很容易搜到这个[\u4e00-\u9fa5],但是它不算全面,不包含一些生僻汉字。

本文对此问题做一个梳理。

以下是比较全面的汉字Unicode分布,参考Unicode 10.0标准(2017年6月发布):

正则表达式不包含空格

★ 如果想表示最普遍的汉字,用:

[\u4E00-\u9FFF] 或 [一-]

共有20950个汉字,包括了常用简体字和繁体字,镕等字。

基本就是GBK的所有(21003个)汉字。也包括了BIG5的所有(13053个)繁体汉字。

一般情况下这个就够用了。

说明:

仅仅未包括出现在GBK里的CJK兼容汉字的21个汉字:郎凉秊裏隣兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩

CJK兼容汉字用于转码处理,日常中是用不到的,所以不包括也没什么问题。

注意此凉非彼凉,兀也不是常用的那个,虽然用眼睛看是一样的,参见 http://www.zhihu.com/question/20697984

★ 如果想表示BMP之内的汉字,也就是Unicode值<=0xFFFF之内的所有汉字,用:

[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF]

这个包含但不限于GBK定义的汉字,共有28025个汉字。

说明:

和上面相比,主要是多了CJK统一汉字扩展A区,这是1999年收录到Unicode 3.0标准里的6,582个汉字。

CJK统一汉字扩展A区,包括了东亚各地区(陆港台日韩新越)的汉字,有很多康熙字典的繁体字。

★ 如果想尽可能表示所有的汉字,用:

[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF\U00020000-U0002EBEF]

这个包含上表的所有88342个汉字

说明:

1, 以上正则表达式不会匹配(英文、汉字的)标点符号,不会匹配韩国拼音字、日本假名。

2, 匹配一些日本、韩国独有的汉字。

3, 包含了一些没有汉字的空位置,这通常不碍事。

4, \u及\U的正则语法在Python 3.5上测试通过。

有些正则表达式引擎不认\uFFFF和\UFFFFFFFF这样的语法,可以换成\x{FFFF}试一下;有些不支持BMP之外的范围,这就没办法处理CJK统一汉字扩展B~E区了,如notepad++。

7.3 匹配一些特殊符号

正则表达式的各种括号的用处以及如何进行括号的匹配。

匹配小括号中的内容

import re string = 'shain(love)fufu)' p1 = re.compile(r'[(](.*?)[)]', re.S) 39;[(](.*)[)]', re.S) #贪婪匹配 print(re.findall(p1, string)) print(re.findall(p2, string))

输出:

[‘love’]

[‘love)fufu’]

匹配中括号中的内容

import re string = 'shainfufu)' p =r'[[\W\w]+]' print(re.findall(p, string))

输出:

[’’]

匹配大括号中的内容

import re string = "shain,fsf{傻夫夫,grr},胖妮{fsf,1201}" p = re.findall(r'({.*?})', string) print(p)

输出:

[’{傻夫夫,grr}’, ‘{fsf,1201}’]

本文【正则表达式不包含空格】由作者: 主键 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4615.html

(0)
上一篇 2023-03-16 09:05:11
下一篇 2023-03-17 08:04:50

相关推荐

  • 线索二叉树是什么结构 引入线索二叉树的目的是

    1 线索二叉树的概念 1.1 遍历二叉树的结果是一个节点的线性序列。可以利用这些空链域存放指向节点的前驱节点和后继节点的指针。这样对指向该线性序列中的”前驱节点”和”后继节点”的指针,称为线索。 1.2 线索二叉树:二叉树的每个节点上加上线索的二叉树。 1.3 二叉树线索化:对二叉树以某种方式遍历使其变为线索二…

    2023-03-21
    000
  • acceledent加速器

    近日,Zonff Partners宣布成立Web3创业加速器Aceleap,加速Web3早期创新生态发展。Aceleap首期将主要面向全球优秀的Web3华人创业者,Aceleap的核心优势是基于美元基金的筛选、孵化、赋能体系,以及Zonff Partners Eco的加密生态资源支持。 Aceleap将为创业者带来持续近5个月、总计近40个主题的线上线下同步…

    2023-03-20
    000
  • 电脑的发展史简单介绍100字_电脑的发展史简介

    计算机的发展历史可以追溯到古希腊时期,当时已经有一些机械计算器。 但是,真正意义上的计算机是在 20 世纪初期诞生的。1936 年,英国数学家 Alan Turing 发明了第一台逻辑机器,从而奠定了计算机科学的基础。 1940 年代,第二次世界大战期间,计算机被广泛用于军事计算。1943 年,美国科学家设计了第一台大型电子计算机,称为 ENIAC,它被用于…

    2023-03-13
    500
  • asp木马不具有远程溢出提权功能_asp木马防火墙

    其实说道木马很多人都觉得很恐怖,会入侵电脑,破坏电脑操作系统盗取电脑信息文件的东西。但是不仅仅如此。本文只是普及算是扫盲,没有深入探讨,有大神的请绕道。能让大家都学习而已。 木马本身就是一种程序,只是其本身的特殊性导致可能存在一些特殊的权限,可以控制你的网站或者通过一些端口来控制你的服务器(个人计算机本身就是服务),仅此而已。 一般服务器木马分为大马和小马,…

    2023-03-19
    000
  • 学生信息管理系统代码_学生信息管理系统报告

    目 录 第一章 产品与服务介绍 第二章 软件工具的介绍 第三章 市场分析及定位介绍 第四章 商业模式 第五章 营销策略 第六章 财务分析 第七章 风险控制 第八章 团队介绍 第一章 产品与服务介绍 项目背景: 随着互联网用户群的越来越大,当前,全球互联网发展正进入泛在普及、深度融合、变革创新、引领转型的新阶段,对各国经济社会运行、生产生活方式、公共服务模式正…

    2023-03-11
    600
  • php云系统 验证码客户端回显

    一,介绍 1.1 验证码漏洞 顾名思义,验证码漏洞就是验证码本身存在问题,或者是与验证码相关的内容存在问题。 1.2 验证码作用 客户端发起请求-> 服务端响应并创建一个新的 SessionID 同时生成随机验证码,将验证码和 SessionID 一并返回给客户端-> 客户端提交验证码连同 SessionID 给服务端-> 服务端验证验证码…

    2023-03-21
    000
  • vector嵌套vector用法 vector中函数用法

    一:介绍 vector是C++标准模板库,是一个容器,底层是数组,为连续内存。 命名空间为std,所属头文件为<vector> 注意:不是<vector.h> vector存储数据时,会分配一个存储空间,如果继续存储,该分配的空间已满,就会分配一块更大的内存,把原来的数据复制过来,继续存储,这些性能也会一定程度上会有损耗 二:常用操作…

    2023-03-15
    100
  • 电脑运行关闭启动项命令

    方法一: 1.使用命令键(Win + R)打开运行窗口,输入:msconfig,然后单击“确定”。 2.您还可以在附件下方左下角的开始菜单中查看操作。 3.选择“启动”,删除不想在启动时启动的应用程序,然后在删除后单击“确定”。 4.单击重新启动以生效,或单击以在空闲时退出并重新启动。 方法二: 1.您可以在“任务管理器”中直接关闭不必要的启动项。 2.右键…

    2023-03-15
    100
  • 怎么制作下拉菜单选项,如何从表格中筛选出想要的部分

    今天跟大家分享下如何制作一个智能的下拉菜单,它可以根据单元格输入的内容来自动显示我们想要输入的数据,如下图所示,非常适合用于下拉数据比较多的情况,比如我们输入一个【小】字,就会在下拉中显示【小米】的所有型号。这个操作也比较简单,下面我们就来一起学习下吧 一、所需函数 想要在Excel中实现这样的效果,我们需要用到3个函数,先来简单的了解下这3个函数的作用与参…

    2023-03-17
    000
  • 安卓编程入门书籍推荐(编程书籍入门必备)

    大家好,最近一段时间,Android 方面的书籍可谓是百花齐放,这几本书的作者都是在一线互联网公司奋斗的工程师,他们把多年的工作经验,身心耕植,汇聚成一本书。作为菜鸟的我们,只有一睹大神的风采了。所以借这个周末,我也列举了一些书,作为一个Android 开发工程师,这些书都是不可多得的好书,书中知识迟早是要掌握的。 我们都知道开发Android App 是用…

    2023-03-18
    000

发表回复

登录后才能评论
返回顶部
错说博客上线啦!