常用的python正则表达式(正则之王正则表达式的三类玩法Powershell)
Python正则表达式的核心及“趣味”应用
正则的“游戏”规则0——3类元素与4类字符正则表达式元素可以归为三大类:
- 字符:字符可以代表一个单独的字符,或者一个字符集合构成的字符串。
- 限定符:允许你在模式中决定字符或者字符串出现的频率。
- 定位符:允许你决定模式是否是一个独立的单词,或者出现的位置必须在句子的开头还是结尾。
正则表达式的代表模式一般由四种不同类型的字符构成:
- 文字字符:像”abc”确切地匹配”abc“字符串
- 转义字符:一些特殊的字符例如反斜杠,中括号,小括号在正则表达式中居于特殊的意义,所以如果要专门识别这些特殊字符需要转义字符反斜杠。就像”[abc]”可以识别”[abc]”。
- 预定义字符:这类字符类似占位符可以识别某一类字符。例如”\d”可以识别0-9的数字。
- 自定义通配符:包含在中括号中的通配符。例如”[a-d]”识别a,b,c,d之间的任意字符,如果要排除这些字符,可以使用”[^a-d]”。
限定符
元素 |
描述 |
兽型 |
* |
匹配一个元素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个字符) |
识别IP
类似IP地址的模式通过正则表达式来描述比简单的通配符字符会更加精确。通常会使用字符和量词结合,来指定某个具体的字符应当出现,以及出现的频率:
模式被描述成4个类似的数字,每个数字以圆句句号分割,每个数字的位数介于1-3。另外在开始和结尾可以包含空格。当这些数字处于0到255之间时,IP的验证还是挺完美的。但是当某个数字超过255时,则显得无能为力。
***Powershell功能已经被MS磨练的无比强大,建议都操练一下,绝对有好处的!如果有不熟悉的,可以看本文下一节“正则的“游戏”2——Python 玩法”。
验证Email格式
如果你想验证用户提供的E-Mail地址是不是一个合法电子邮件格式,可以使用下面的正则表达式:
无论什么时候,希望一个表达式以一个单独的“单词”在文本中出现,可以使用分隔符:单词边界(定位符”\b”),这样正则表达式就会知道你感兴趣的是字符串中除去那些白空格(像空格,制表符,换行符)以外的字符。
大小写敏感
为了和PowerShell的习惯保持一致,操作符-match是大小写不敏感的,如果你想切换至大小写敏感的操作符可以使用“-cmatch”。
组
一串原始的文本行通常有大量有用信息,你可以使用子表达式来收集数据,可以在之后单独使用。基本的规则是所有想通过模式来搜索的数据应当放在圆括号中,因为变量$matches会将这些子表达式以单独的序列返回。如果文本行首先包含了数据,然后是其它文本,两者之间以制表符分割,可以如下描述这段模式:
替换字符串
之前介绍过-replace操作符,你可以能已经知道了怎样替换字符串中的字串。
但是这种简单的替换不可能永远都是高效的,因此可以尝试使用正则表达式来完成替换工作。下面有一个好玩的例子,用来演示它怎样实用。也许你会碰到将多个类似的词语替换成同一个词语这样的需求。如果没有正则表达式,需要重复使用replace操作符多次。而每一次replace都会伴随一次遍历,效率明显很低。取而代之,如果使用正则表达式,则非常方便。
删除多余的空格、搜索和移除重复的单词
使用正则表达式可以完成一些日常任务,比如一处一个字符串中多余的白空格。模式需要描述一个空格(字符:“\s”)至少出现两次(限定符:“{2,}”)。然后以一个正常的单空格字符替换。
怎样才能移除文本中多余的单词。这里,仍旧可以再次使用空格。模式可以这样定义:\b(\w )(\s \1){1,}\b模式会搜索一个单词(以“\b”定位),它由一个单词组成(字符“\w” 和限定符“ ”),白空格紧随以后(字符“\s”和限定符“ ”)。该模式中,白空格字符和将要被替换的单词必须至少出现一次(至少一次或者更多次,使用限定符“{1,}”)。整个模式会被第一次出现的反向引用给替换掉,也就是位于第一个的单词。
文件操作实例——在d:\1.txt文件中,找到夹在数字串中的字母串
1.txt的内容如下:
1
12
12aaa3
123bbb4
123ccc45
我们是要把aaa bbb ccc找出来。
$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元素值。
正则的“游戏”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函数功能一致,只不过返回一个元组 (字符串, 替换次数)。
正则的“游戏”3——无语玩法,https://tool.oschina.net/regex
只要这个网站还能使用,就请尽情地“测试”吧,先来一个。
上图匹配条件解释:0-9的任一数字开头,单词结尾,所以匹配;
下图匹配条件解释:0-9的任一数字开头,单词结尾,但是中间的内容没有设置条件,所以不匹配;
下图匹配条件解释:0-9的任一数字开头,单词结尾,中间的内容设置了'.*'条件,所以匹配;另外,如果'^[0-9]{4,9}.*\w*$',就无法匹配。
该游戏抛开的程序语言了,可以专心调试正则的语法,好好的训练。
给出简单案例,作为思考训练吧:
搜索邮政编码并将其替换为字符'lyc'
PowerShell笔记 - 13.正则表达式 - 门前有根大呲花 - 博客园
Python正则表达式,看这一篇就够了
基于正则的人工智能九分进阶——“随心所欲”的中文词匹配001
Python 正则表达式详解(建议收藏!)_山山而川'的博客-CSDN博客_python正则表达式
python 正则表达式详解 - 天妖姥爷 - 博客园
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com