欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python编程学习之正则表达式操作讲解

程序员文章站 2022-05-18 23:53:47
个人觉得,正则表达式是最基本的东西,因为,正则表达式很具有通用性,无论何种语言,或者系统都有正则表达式的影子, 并且各种文件操作,已经网页的数据获取,都可以用到正则表达式,所以我...

个人觉得,正则表达式是最基本的东西,因为,正则表达式很具有通用性,无论何种语言,或者系统都有正则表达式的影子,

并且各种文件操作,已经网页的数据获取,都可以用到正则表达式,所以我决定第一章开始介绍正则表达式.

什么是是正则表达式:

简单的说,正则表达式就是一些有字符和图书符号组成的字符串,它描述了模式 或者表示的多种字符.或者换句话说就是能按照某种模式匹配(matching)一系列有相似特征的字符串.

匹配(matching):

是指判断一个字符串能否从起始处全部或者部分地匹配某个模式。

python的标准库中提供re模块来支持正则表达式.现在我们了解的正则的基本概念,下面就开始了解正则表达式吧.

1. 普通字符:

普通字符,就是没有任何特殊含义的字符,例如数字,字母.

下面所介绍的正则表达式都是最基本、最普通的。它们仅仅用一个简单的字符串构造成一个匹配字符串的模式:

该字符串由正则表达式定义。下面所示为几个正则表达式和它们所匹配的字符串。

正则表达式模式 匹配的字符串
name name
Python Python
2018 2018

这样的表达式,只能匹配相同的东西,这个可以用来匹配文件或者文章里某个词语出现的次数.这样的使用方法太过单一,所以我们需要深入的学习就是元字符.

2.元字符:

元字符:特殊符号或者特殊符号加上字符的组合,即所谓的元字符.

表 示 法 描 述 正则表达式示例
符号
literal 匹配文本字符串的字面值 literal foo
re1|re2 匹配正则表达式 re1 或者 re2 foo|bar
. 匹配任何字符(除了\n 之外) b.b
^ 匹配字符串起始部分 ^Dear
$ 匹配字符串终止部分 /bin/*sh$
* 匹配 0 次或者多次前面出现的正则表达式 [A-Za-z0-9]*
+ 匹配 1 次或者多次前面出现的正则表达式 [a-z]+\.com
  匹配 0 次或者 1 次前面出现的正则表达式 goo
{N} 匹配 N 次前面出现的正则表达式 [0-9]{3}
{M,N} 匹配 M~N 次前面出现的正则表达式 [0-9]{5,9}
[…] 匹配来自字符集的任意单一字符 [aeiou]
[..x-y..] 匹配 x~y 范围中的任意单一字符 [0-9], [A-Za-z]
[^…] 不匹配此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现) [^aeiou], [^A-Za-z0-9]
(*|+||{}) 用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、 +、 、 {}) .*[a-z]
(…) 匹配封闭的正则表达式,然后另存为子组 ([0-9]{3}),f(oo|u)bar
表 示 法 描 述 正则表达式示例
特殊字符
\d 匹配任何十进制数字,与[0-9]一致(\D 与\d 相反,不匹配任何非数值型的数字) data\d+.txt
\w 匹配任何字母数字字符,与[A-Za-z0-9_]相同(\W 与之相反) [A-Za-z_]\w+
\s 匹配任何空格字符,与[\n\t\r\v\f]相同(\S 与之相反) of\sthe
\b 匹配任何单词边界(\B 与之相反) \bThe\b
\N 匹配已保存的子组 N(参见上面的(…)) price: \16
\c 逐字匹配任何特殊字符 c(即,仅按照字面意义匹配,不匹配特殊含义) \., \\, \*
\A(\Z) 匹配字符串的起始(结束)(另见上面介绍的^和$) \ADear
扩展表示法
(iLmsux) 在正则表达式中嵌入一个或者多个特殊“标记” 参数(或者通过函数/方法) (x),(? im)
(:…) 表示一个匹配不用保存的分组 (:\w+\.)*
(P…) 像一个仅由 name 标识而不是数字 ID 标识的正则分组匹配 (P)
(P=name) 在同一字符串中匹配由(P)分组的之前文本> (P=data)
(#…) 表示注释,所有内容都被忽略 (#comment)
(=…) 匹配条件是如果…出现在之后的位置,而不使用输入字符串;称作正向前视断言 (=.com)
(!…) 匹配条件是如果…不出现在之后的位置,而不使用输入字符串;称作负向前视断言 (!.net)
(<=…) 匹配条件是如果…出现在之前的位置,而不使用输入字符串;称作正向后视断言 (<=800-)
( 匹配条件是如果…不出现在之前的位置,而不使用输入字符串;称作负向后视断言 (
((id/name)Y|N ) 如果分组所提供的 id 或者 name(名称)存在,就返回正则表达式的条件匹配 Y,如
果不存在,就返回 N; |N 是可选项
((1)y|x)

这个表个内的东西,就是需要我们深入学习的内容.现在,我们大概看一下就可以了,知道有哪些东西.

我们再了解一下核心函数和使用方法,我们先大概的了解一下.下一章会有详细的代码说明.

函数/方法 描 述

仅仅是 re 模块函数

compile(pattern, flags = 0) 使用任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象

re 模块函数和正则表达式对象的方法

match(pattern, string, flags=0) 尝试使用带有可选的标记的正则表达式的模式来匹配字符串。如果匹配成功,就返回
匹配对象; 如果失败,就返回 None
search(pattern, string, flags=0) 使用可选标记搜索字符串中第一次出现的正则表达式模式。如果匹配成功,则返回匹
配对象; 如果失败,则返回 None
findall(pattern, string [, flags] )① 查找字符串中所有(非重复)出现的正则表达式模式,并返回一个匹配列表
finditer(pattern, string [, flags] )② 与 findall()函数相同,但返回的不是一个列表,而是一个迭代器。对于每一次匹配,迭
代器都返回一个匹配对象
split(pattern, string, max=0)③ 根据正则表达式的模式分隔符, split 函数将字符串分割为列表,然后返回成功匹配的
列表,分隔最多操作 max 次(默认分割所有匹配成功的位置)

re 模块函数和正则表达式对象方法

sub(pattern, repl, string, count=0) ③ 使用 repl 替换所有正则表达式的模式在字符串中出现的位置,除非定义 count, 否则就
将替换所有出现的位置(另见 subn()函数,该函数返回替换操作的数目)
purge() 清除隐式编译的正则表达式模式

常用的匹配对象方法(查看文档以获取更多信息)

group(num=0) 返回整个匹配对象,或者编号为 num 的特定子组
groups(default=None) 返回一个包含所有匹配子组的元组(如果没有成功匹配,则返回一个空元组)
groupdict(default=None) 返回一个包含所有匹配的命名子组的字典,所有的子组名称作为字典的键(如果没有
成功匹配,则返回一个空字典)

常用的模块属性(用于大多数正则表达式函数的标记)

re.I、 re.IGNORECASE 不区分大小写的匹配
re.L、 re.LOCALE 根据所使用的本地语言环境通过\w、 \W、 \b、 \B、 \s、 \S 实现匹配
re.M、 re.MULTILINE ^和$分别匹配目标字符串中行的起始和结尾,而不是严格匹配整个字符串本身的起始
和结尾
re.S、 rer.DOTALL “.”(点号)通常匹配除了\n(换行符)之外的所有单个字符;该标记表示“.”(点号)
能够匹配全部字符
re.X、 re.VERBOSE 通过反斜线转义, 否则所有空格加上#(以及在该行中所有后续文字)都被忽略,除非
在一个字符类中或者允许注释并且提高可读性

以上表格均来自<编程第三版>>.