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

Python023

学Python正则表达式,这一篇就够了,第1张

正则表达式是一个特殊的字符序列,可以帮助您使用模式中保留的专门语法来匹配或查找其他字符串或字符串集。 正则表达式在UNIX世界中被广泛使用。

注:很多开发人员觉得正则表达式比较难以理解,主要原因是缺少使用或不愿意在这上面花时间。

re模块在Python中提供对Perl类正则表达式的完全支持。如果在编译或使用正则表达式时发生错误,则re模块会引发异常re.error。

在这篇文章中,将介绍两个重要的功能,用来处理正则表达式。 然而,首先是一件小事:有各种各样的字符,这些字符在正则表达式中使用时会有特殊的意义。 为了在处理正则表达式时避免混淆,我们将使用:r'expression'原始字符串。

匹配单个字符的基本模式

编译标志可以修改正则表达式的某些方面。标志在re模块中有两个名称:一个很长的名称,如IGNORECASE,和一个简短的单字母形式,如。

1.match函数

此函数尝试将RE模式与可选标志的字符串进行匹配。

下面是函数的语法 :

这里是参数的描述 :

pattern : 这是要匹配的正则表达式。

string : 这是字符串,它将被搜索用于匹配字符串开头的模式。 |

flags : 可以使用按位OR(|)指定不同的标志。 这些是修饰符,如下表所列。

re.match函数在成功时返回匹配对象,失败时返回None。使用match(num)或groups()函数匹配对象来获取匹配的表达式。

示例

当执行上述代码时,会产生以下结果 :

2.search函数

此函数尝试将RE模式与可选标志的字符串进行匹配。

下面是这个函数的语法 :

这里是参数的描述 :

pattern : 这是要匹配的正则表达式。

string : 这是字符串,它将被搜索用于匹配字符串开头的模式。 |

flags : 可以使用按位OR(|)指定不同的标志。 这些是修饰符,如下表所列。

re.search函数在成功时返回匹配对象,否则返回None。使用match对象的group(num)或groups()函数来获取匹配的表达式。

示例

当执行上述代码时,会产生以下结果 :

3.匹配与搜索

Python提供基于正则表达式的两种不同的原始操作:match检查仅匹配字符串的开头,而search检查字符串中任何位置的匹配(这是Perl默认情况下的匹配)。

示例

当执行上述代码时,会产生以下结果 :

4.搜索和替换

使用正则表达式re模块中的最重要的之一是sub。

模块

此方法使用repl替换所有出现在RE模式的字符串,替换所有出现,除非提供max。此方法返回修改的字符串。

示例

当执行上述代码时,会产生以下结果 :

5.正则表达式修饰符:选项标志

正则表达式文字可能包含一个可选修饰符,用于控制匹配的各个方面。 修饰符被指定为可选标志。可以使用异或(|)提供多个修饰符,如前所示,可以由以下之一表示 :

6.正则表达模式

除了控制字符(+ ? . * ^ $ ( ) [ ] { } | ),所有字符都与其自身匹配。 可以通过使用反斜杠将其转换为控制字符。

7.正则表达式示例

字符常量

字符类

特殊字符类

重复匹配

非贪婪重复

这匹配最小的重复次数 :

用圆括号分组

反向引用

这与以前匹配的组再次匹配 :

备择方案

python|perl : 匹配“python”或“perl”

rub(y|le) : 匹配 “ruby” 或 “ruble”

Python(!+|?) : “Python”后跟一个或多个! 还是一个?

锚点

这需要指定匹配位置。

带括号的特殊语法

开课吧广场-人才学习交流平台-开课吧

上节我们说到 Python 正则表达式的基本字符,以及这些字符的用法

今天,我们继续讲讲 Python 中一些扩展标记法,以及一些特殊序列

(?...) : 这种扩展标记法以括号内 ? 开头,其后第一个字符决定了采用什么样的语法。

在 ? 后面添加( 'a', 'i', 'L', 'm', 's', 'u', 'x' 中的一个或多个),然后加上匹配规则。

这些字符对正则表达式设置以下标记,免去设置 flag 参数

注意 : 'a', 'L', 'u' 作为内联标记是相互排斥的,它们不能结合在一起

括号分组的非捕获版本,该分组所匹配的子字符串 不能 在执行匹配后被获取或是在之后的模式中被引用

可以配合 | 和 {m} 使用

为分组再指定一个组合名

每个组合名只能用一个正则表达式定义,只能定义一次

反向引用一个命名组合

匹配前面那个名字叫 name 的命名组中匹配到的字符串

注释信息,里面的内容会被忽略。

哈哈,是不是没看懂,没事,举个栗子

看看,是不是一下子就明了了。

哈哈,这个又看不懂?

思考一下,既然有根据后面字符断言的,那么根据前面字符来断言,也是很合理的,

如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-pattern , no-pattern 可选,也可以被忽略。

是不是有点像 if else 三目运算,其中 id 和 name 是分组 id 、和指定的分组名 name

照旧,举个栗子吧

看了栗子是不是有点糊涂呢,我们来解析一下这个正则表达式

其结果匹配的就是 [email protected]>和 [email protected]

而不会匹配 [email protected] ' 和 [email protected]

但是上面的第三个结果为啥不一样呢?

因为 findall 允许返回空匹配的,在有 ? 的情况下,所以它会分两种情况去匹配

今天讲了一些扩展标记法,其实没那么难,多看看例子,多练习练习。

下节将介绍 re 模块各函数的用法,敬请期待......

这个问题的确比较纠结首先明确一点

m.groups()==m.group(1)+m.group(2)+...+m.group(n)

要确定m.group(n)中的n到底是多少???

1.在你的匹配式中出现了几次匹配成功的括号,n就是几

给你举个例子m = re.match("([abc])+([abc])+", "abc"):

它出现了2次括号,且这两次括号都能匹配,所以n=2。你可以print m.group(2)不会报错,而m = re.match("([abc])+", "abc"),print m.group(2)则会报错

2.其次python的匹配引擎是从后面开始的

在给你举个对比的例子:

例子1:m = re.match("([abc])+([abc])+([abc])+", "abc"):

如果你理解第一点,n=3,然后你可以print 一下 你会发现:

m.group(3)=‘c’ ,m.group(2)='b',m.group(1)='a'

例子2:m = re.match("([abc])+([abc])+", "abc"):

m.group(1)=b,m.group(2)='c'

( python中说明了n在0-99间都是可以的,如果超出的话IndexErrorexception跳出)

如果你能看明白那么应该groups的相应东西你理解的差不多了,接下来看你第二问

?表示匹配前面的表达式0个或一次,例子:go?匹配go为0或者1次

:呵呵 就是冒号的意思,所以你懂的,没匹配到

写那么多,如果不明白,可以再问我哈 万请采纳