常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)

正则是什么?正则的渊源?正则的有穷状态自动机

Python正则表达式的核心及“趣味”应用

正则的“游戏”规则0——3类元素与4类字符

正则表达式元素可以归为三大类:

  • 字符:字符可以代表一个单独的字符,或者一个字符集合构成的字符串。
  • 限定符:允许你在模式中决定字符或者字符串出现的频率。
  • 定位符:允许你决定模式是否是一个独立的单词,或者出现的位置必须在句子的开头还是结尾。

正则表达式的代表模式一般由四种不同类型的字符构成:

  • 文字字符:像”abc”确切地匹配”abc“字符串
  • 转义字符:一些特殊的字符例如反斜杠,中括号,小括号在正则表达式中居于特殊的意义,所以如果要专门识别这些特殊字符需要转义字符反斜杠。就像”[abc]”可以识别”[abc]”。
  • 预定义字符:这类字符类似占位符可以识别某一类字符。例如”\d”可以识别0-9的数字。
  • 自定义通配符:包含在中括号中的通配符。例如”[a-d]”识别a,b,c,d之间的任意字符,如果要排除这些字符,可以使用”[^a-d]”。
正则的“游戏”规则1——符号大全介绍

限定符

元素

描述

兽型

*

匹配一个元素0次或者多次(最大限度地匹配)

贪心

.*

匹配任意个数的任意字符(包括0个字符)

贪心

?

匹配上一个元素0次或者1次(最大限度地匹配)

不贪心

??

匹配上一个元素0次或者1次(最小限度地匹配)

不贪心

{n,}

匹配上一个元素至少n次

{n,m}

匹配上一个元素n至m次

{n}

匹配上一个元素n次

匹配上一个元素一次或者多次

贪心

*——贪心就是一直匹配直到匹配到字符串结束;or 贪婪:当我们使用正则去匹配一个字符串的时候,它会尽可能多地去捕获内容,这个就是正则的贪婪。正则表达式默认匹配方式为贪婪匹配。用*、 或 ? 进行不确定匹配,函数将会尽最大可能匹配尽可能长的字符串,但有时我们只想让其匹配最小范围的字串,这需要在*、 后加一个问号,表示把贪婪匹配转换为“非贪心”表达式或者最小匹配。

?——不贪心就是遇到匹配成功的字符串就算成功(加? 也就是.*后边的?);or 非贪婪:当我们使用正则去匹配一个字符串的时候,它会尽可能少地去捕获内容,这个就是正则的非贪婪。

定位符

元素

描述

$

在字符串的结尾匹配

\A

在字符串的开始匹配(包含多行文本)

\b

在单词的边界匹配

\B

不在单词的边界匹配

\Z

在字符串的结尾匹配(包含多行文本)

^

在字符串的开始匹配

字符

元素

描述

.

匹配除了换行符意外的任意字符

[^abc]

匹配除了包含在中括号的任意字符

[^a-z]

匹配除了包含在中括号指定区间字符的任意字符

[abc]

匹配括号中指定的任意一个字符

[a-z]

匹配括号中指定的任意区间中的任意一个字符

\a

响铃字符(ASCII 7)

\c or \C

匹配ASCII 中的控制字符,例如Ctrl C

\d

匹配数字字符,等同于[0-9]

\D

匹配数字以外的字符

\e

Esc (ASCII 9)

\f

换页符(ASCII 15)

\n

换行符

\r

回车符

\s

白空格(空格,制表符,新行)

\S

匹配白空格(空格,制表符,新行)意外的字符

\t

制表符

\uFFFF

匹配Unicode字符的十六进制代码FFFF。例如,欧元符号的代码20AC

\v

匹配纵向制表符(ASCII 11)

\w

匹配字符,数字和下划线

\W

匹配字符,数字和下划线意外的字符

\xnn

匹配特殊字符,nn代表十六进制的ASCII 码

.*

匹配任意数量的字符(包括0个字符)

正则的“游戏”1——Powershell 玩法

识别IP

类似IP地址的模式通过正则表达式来描述比简单的通配符字符会更加精确。通常会使用字符和量词结合,来指定某个具体的字符应当出现,以及出现的频率:

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(1)

模式被描述成4个类似的数字,每个数字以圆句句号分割,每个数字的位数介于1-3。另外在开始和结尾可以包含空格。当这些数字处于0到255之间时,IP的验证还是挺完美的。但是当某个数字超过255时,则显得无能为力。

***Powershell功能已经被MS磨练的无比强大,建议都操练一下,绝对有好处的!如果有不熟悉的,可以看本文下一节“正则的“游戏”2——Python 玩法”。

验证Email格式

如果你想验证用户提供的E-Mail地址是不是一个合法电子邮件格式,可以使用下面的正则表达式:

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(2)

无论什么时候,希望一个表达式以一个单独的“单词”在文本中出现,可以使用分隔符:单词边界(定位符”\b”),这样正则表达式就会知道你感兴趣的是字符串中除去那些白空格(像空格,制表符,换行符)以外的字符。

大小写敏感

为了和PowerShell的习惯保持一致,操作符-match是大小写不敏感的,如果你想切换至大小写敏感的操作符可以使用“-cmatch”。

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(3)

一串原始的文本行通常有大量有用信息,你可以使用子表达式来收集数据,可以在之后单独使用。基本的规则是所有想通过模式来搜索的数据应当放在圆括号中,因为变量$matches会将这些子表达式以单独的序列返回。如果文本行首先包含了数据,然后是其它文本,两者之间以制表符分割,可以如下描述这段模式:

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(4)

替换字符串

之前介绍过-replace操作符,你可以能已经知道了怎样替换字符串中的字串。

但是这种简单的替换不可能永远都是高效的,因此可以尝试使用正则表达式来完成替换工作。下面有一个好玩的例子,用来演示它怎样实用。也许你会碰到将多个类似的词语替换成同一个词语这样的需求。如果没有正则表达式,需要重复使用replace操作符多次。而每一次replace都会伴随一次遍历,效率明显很低。取而代之,如果使用正则表达式,则非常方便。

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(5)

删除多余的空格、搜索和移除重复的单词

使用正则表达式可以完成一些日常任务,比如一处一个字符串中多余的白空格。模式需要描述一个空格(字符:“\s”)至少出现两次(限定符:“{2,}”)。然后以一个正常的单空格字符替换。

怎样才能移除文本中多余的单词。这里,仍旧可以再次使用空格。模式可以这样定义:\b(\w )(\s \1){1,}\b模式会搜索一个单词(以“\b”定位),它由一个单词组成(字符“\w” 和限定符“ ”),白空格紧随以后(字符“\s”和限定符“ ”)。该模式中,白空格字符和将要被替换的单词必须至少出现一次(至少一次或者更多次,使用限定符“{1,}”)。整个模式会被第一次出现的反向引用给替换掉,也就是位于第一个的单词。

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(6)

文件操作实例——在d:\1.txt文件中,找到夹在数字串中的字母串

1.txt的内容如下:

1

12

12aaa3

123bbb4

123ccc45

我们是要把aaa bbb ccc找出来。

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(7)

$reg是一个正则表达式,但注意括号里面(?\w ?),“\w ?”这段不陌生,非贪婪的匹配Alpha字符。“?”这段与正则表达式本身无关,它是PowerShell弄出来比较方便的获取括号内的匹配值的一个变量。这句有点绕,简单的说,它制造了一个变量,这个变量的值是括号内的正则表达式匹配到的值,即“\w ?”匹配到的值。我们以前学C#的时候,知道用match.Group[n]来获取括号内的值。这里是同样的道理。如果有多个括号,则可以为每个括号设置一个变量。

什么情况下$matches有两个值呢?

如下所示,$pattern变量的值为abc(\d{3})。这个在$matches[0]的值就变成了abc123。这说明,$matches[0]表示的是与正则表达式相匹配的内容。而$matches[1]及之后的内容,则是对应着正则表达式的一个个小括号里面匹配到的内容。示例中我们只有一个小括号,那只有$matches[1]。试想一下,如果正则表达式有多小括号,则会有多个$matches元素值。

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(8)

正则的“游戏”2——Python 玩法

Python的正则玩法是最多的,这里只列举几个例子;相关例子可以查看文后的链接,或者网上搜索。

正则实现每隔5个字的后面加个符号*

# import re line='有穷状态自动机是一种计算机程序的模型,可以用来转化解析正则表达式。' re.sub('(.{5})',r'\1*',line) 结果示例: '有穷状态自*动机是一种*计算机程序*的模型,可*以用来转化*解析正则表*达式。'

re模块函数

查找一个匹配项

查找并返回一个匹配项的函数有3个:search、match、fullmatch,分别是:

  • search: 查找任意位置的匹配项
  • match: 必须从字符串开头匹配
  • fullmatch: 整个字符串与正则完全匹配

查找多个匹配项

讲完查找一项,现在来看看查找多项吧,查找多项函数主要有:findall函数finditer函数

  • findall: 从字符串任意位置查找,返回一个列表
  • finditer:从字符串任意位置查找,返回一个迭代器

两个方法基本类似,只不过一个是返回列表,一个是返回迭代器;列表是一次性生成在内存中,而迭代器是需要使用时一点一点生成出来的,内存使用更优。

分割

re.split(pattern, string, maxsplit=0, flags=0)函数:用pattern分开 string ,maxsplit表示最多进行分割次数,flags表示模式,就是指常量!

注意:str模块也有一个 split函数 ,那这两个函数该怎么选呢?str.split函数功能简单,不支持正则分割,而re.split支持正则。1000次循环以内str.split函数更快,而循环次数1000次以上后re.split函数明显更快,而且次数越多差距越大!

替换

替换主要有sub函数subn函数,二者功能类似!

先来看看sub函数的用法:

re.sub(pattern, repl, string, count=0, flags=0)函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。

值得注意的是:sub函数中的入参:repl替换内容既可以是字符串,也可以是一个函数哦!如果repl为函数时,只能有一个入参:Match匹配对象。

re.subn(pattern, repl, string, count=0, flags=0)函数与re.sub函数功能一致,只不过返回一个元组 (字符串, 替换次数)。

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(9)

正则的“游戏”3——无语玩法,https://tool.oschina.net/regex

只要这个网站还能使用,就请尽情地“测试”吧,先来一个。

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(10)

上图匹配条件解释:0-9的任一数字开头,单词结尾,所以匹配;

下图匹配条件解释:0-9的任一数字开头,单词结尾,但是中间的内容没有设置条件,所以不匹配;

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(11)

下图匹配条件解释:0-9的任一数字开头,单词结尾,中间的内容设置了'.*'条件,所以匹配;另外,如果'^[0-9]{4,9}.*\w*$',就无法匹配。

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(12)

该游戏抛开的程序语言了,可以专心调试正则的语法,好好的训练。

给出简单案例,作为思考训练吧:

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(13)

搜索邮政编码并将其替换为字符'lyc'

常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)(14)

PowerShell笔记 - 13.正则表达式 - 门前有根大呲花 - 博客园

Python正则表达式,看这一篇就够了

基于正则的人工智能九分进阶——“随心所欲”的中文词匹配001

Python 正则表达式详解(建议收藏!)_山山而川'的博客-CSDN博客_python正则表达式

python 正则表达式详解 - 天妖姥爷 - 博客园

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页