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 | 通过反斜线转义, 否则所有空格加上#(以及在该行中所有后续文字)都被忽略,除非 在一个字符类中或者允许注释并且提高可读性 |
以上表格均来自<编程第三版>>.