什么是正则表达式

正则表达式是一组特殊的字符序列、是对字符串操作的一种逻辑公式,正则表达式通常被用来检索、替换那些符合某个模式的文本
比如检测一串数字是否符合电话号码、检测一个字符串是否符合email标准,实现诸如此类的对于字符串或者是文本的操作都可用正则表达式实现,正则表达式的功能是非常强大的,掌握正则表达式也是非常重要的

正则表达式的讲解

认识元字符

(后面会解释re的一些方法,先从基础开始)

import re
string='JavaScript|.Net|Java|Python'
re.findall("正则表达式",string)

在上面代码中,如果我们想要匹配到Python,我们直接可以在正则表达式中直接写入Python,他便会返回一个结果列表,这就是正则最基本的用法,这样的结果并没有意义,因为我们填写的是一个常量字符串,并没有把正则的规则和意义体现出来,正则表达式最重要的就是规则

import re
string='Pyth4on|J5av2a12Script|5.Net|Ja2va'
re.findall("正则表达式",string)

现在有这么一个问题,要求在string字符串中匹配出所有的数字,那么如果我们用刚刚的常量字符串,那么只能写成

re.findall("0",string)
re.findall("1",string)
re.findall("2",string)
...

这样显然也是没有意义的,那该怎么办呢,正则表达式提供了一个抽象的符号 ‘/d’ 代表0-9的任何数字

import re
string='Pyth4on|J5av2a12Script|5.Net|Ja2va'
result=re.findall("\d",string)
print(result)

这样 我们就把该字符串里的所有字符匹配出来了,然后我们回过头来思考一下正则表达式的定义,正则表达式是一组特殊的字符序列,所以正则表达式最终要落入字符这里,之前的我们写的直接匹配Python的字符串,我们的正则表达式就会给他构造一个类型 叫做普通字符 对于这样的一个 ‘/d’ 我们把它叫做元字符 我们的正则表达式就是用一系列的普通字符和元字符组成的,普通字符并没什么可讲性,他就是你看到这样的实实在在的字符,他就是具体的字符 所以我们应该主要学习的就是元字符
正则表达式中有特别多的元字符 如下图(简略的介绍):





看着那么多的元字符是不是头皮发麻了,其实千万不要想着把这些背下来,我们只要根据自己的业务需求,然后将元字符组合成你需要的就可以了,其实日常用的元字符并不多

正则表达式模式 字符集

学习了元字符相信大家对正则表达式有初步了解

接下来我要讲解的知识点就是:正则表达式主要模式之一,字符集 接下来看一个例子:

import re
string='cat,dog,bat,log,sit,pig'
result=re.findall("正则表达式",string)
print(result)

要求:匹配出所有中间字母为o或i的字母,重点是这个
很明显我们不能使用普通字符来匹配
所以我们现在又要用一种抽象来概括 o 和 i 这就是我们字符集的使用
其实很简单:

import re
string='aac,abc,aic,aoc,azc,awc'
result=re.findall("a[io]c",string)
print(result)

我们的字符集用的是 [ ] 然后把我们要抽象的字符集写在中括号里
这里我们还用了普通字符 如果没有普通字符来给我们定界的话,我们无法直接筛选出我们想要的字符的(大家可以试一下) 下面跟大家解释一下字符集的特性:

出现在中括号里面的字符是 关系
他还有另外一个用法:比如匹配除了中间字符为i和o的字符 我们只需要在中括号里面加一个 上尖角 ^
还要一个小技巧,比如我们要匹配的字符太多的话,比如要匹配 bcdefghi 这样的字符集 我们可以直接在中括号里面写 [b-i] 他就可以这这些全部匹配出来了

概括字符集

什么叫概括字符集呢?
比如我们之前学的元字符 \d 他就是一个概括字符集 他可以用字符集写成[0-9] \d就是对他的一种概括(其实有很多叫法) 因为正则表达式是非常灵活的,比如我们刚刚做的匹配数值的哪一题也可以写成:

import re
string='Pyth4on|J5av2a12Script|5.Net|Ja2va'
result=re.findall("[\d]",string)
print(result)

数量词

在我们下列案例中有这么一个问题:

import re
string='Ja5va|Pyth4on|JavaSc1ript|.Ne6t'
result=re.findall("[a-z]",string)
print(result)
输出#['a', 'v', 'a', 'y', 't', 'h', 'o', 'n', 'a', 'v', 'a', 'c', 'r', 'i', 'p', 't', 'e', 't']

你会发现他会把这些单词拆分成一个字母,不管是字符集也好还是元字符也好,他们只能表示一个字符,那如何合成一个单词呢,可能有些人会想出这种办法:

import re
string='python 11java899php'
result=re.findall("[a-z][a-z][a-z]",string)
print(result)
#['pyt', 'hon', 'jav', 'php']

多写几个字符集
那么如果是100个字符呢,所以这种方式肯定是不可取的
那该怎么办呢,这就引出了我们的数量词

import re
string='python 11java899php'
result=re.findall("[a-z]{3}",string)
print(result)
#['pyt', 'hon', 'jav', 'php']

我们在中括号后面加了一个花括号 花括号填写了一个数字3 这个作用就是匹配前面的表达式三次 ,但是这个结果还是有问题的,我们要拿到整体的单词,这个还不是我们想要的,我们在花括号里写了3,匹配出3个一组的字符,那么我们观察一个这几个单词,最小的长度为3 最大的为6,我们的数量词也是支持这样的取值的:

import re
string='python 11java899php'
result=re.findall("[a-z]{3,6}",string)
print(result)
#['python', 'java', 'php']

这就是数量词的用法,他可以吧前面的字符重复N次或者N到M次
在上面案例中 花括号3,6 表示匹配符合规则的字符3-6次 其实当匹配到第三次的时候就已经符合匹配规则了,那么他为什么还要继续匹配呢???
这就涉及到一个比较重要的概念(贪婪和非贪婪),接下来我会讲解

贪婪与非贪婪

什么是贪婪模式 比如我们把匹配规则定义在一个区间内 他会尽可能多的去匹配符合规则的字符 非贪婪反之
python默认的匹配模式是贪婪模式
非贪婪如何表示?
在数量词后面添加一个"?" 这样就表示非贪婪模式 如下(同样是上一题):

import re
string='python 11java899php'
result=re.findall("[a-z]{3,6}?",string)
print(result)
#['pyt', 'hon', 'jav', 'php']

在原理上很简单,但是在具体正则使用的时候贪婪和非贪婪会经常产生一些程序bug的,这个要着重注意的,特别的入门不久的新手
数量词还包括 *(匹配前面字符0次或多次) +(匹配前面字符1次或者多次)

re的一些方法

Python提供了两种不同的原始操作:re.match和re.search。match是从字符串的起点开始做匹配,而search(perl默认)是从字符串做任意匹配
注意 re.match默认是从起点匹配

下列所有方法和示例源于网络 (写累了)

import re
 
ret_match= re.match("c","abcde");     #从字符串开头匹配,匹配到返回match的对象,匹配不到返回None
if(ret_match):
    print("ret_match:"+ret_match.group());
else:
    print("ret_match:None");
 
ret_search = re.search("c","abcde"); #扫描整个字符串返回第一个匹配到的元素并结束,匹配不到返回None
if(ret_search):
    print("ret_search:"+ret_search.group());
    

re.findall上面已经展示了

re.finditer(pattern, string[, flags])
搜索string,返回一个顺序访问每一个匹配结果的迭代器

import re
  
p = repile(r'\d+')
for m in p.finditer('one1two2three3four4'):
    print m.group()

re.sub和re.subn

两种方法都是用来替换匹配成功的字串,值得一提的时,sub不仅仅可以是字符串,也可以是函数。subn函数返回元组
import re
#sub
ret_sub = re.sub(r’(one|two|three)’,‘ok’,‘one word two words three words’) #ok word ok words ok words
#subn
import re
ret_subn = re.subn(r’(one|two|three)’,‘ok’,‘one word two words three words’) #(‘ok word ok words ok words’, 3) 3,表示替换的次数

看完本篇文章希望你有所收获,谢谢观看

更多推荐

Python 正则表达式入门(详细)