很详细python正则表达式使用详解

第一章讲的是字符组(Character Class)。
在正则表达式中,它表示"在同一个位置可能出现的各种字符",其写法是在一对方括号[和]之间列出所有可能出现的字符,简单的字符组比如[ab]、[314]、[#.?]
需要注意的地方有
1)-范围表示法的要按ASCII顺序写, [0-9]是合法的,[9-0]会报错
 
In [1]: import re
 
In [2]: re.search("^[0-9]$", "2") != None
Out[2]: True
 
In [3]: re.search("^[9-0]$", "2") != None
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
Traceback (most recent call last):
error: bad character range

2)匹配数字和字母不要用[0-z],因为这个范围包括很多标点符号,最好写成[0-9a-zA-Z]
 
In [4]: re.search("^[0-z]$", "A") != None
Out[4]: True
 
In [5]: re.search("^[0-z]$", ":") != None
Out[5]: True

3)元字符做为普通字符使用时需要转义,在python代码中,普通字符串的转义需要加两个"",原生字符串需要一个"" 推荐使用原生字符串

 

#原生字符串和字符串的等价
In [6]: r"^[0-9]$" == "^[0\-9]$"
Out[6]: True
#原生字符串的转义要简单许多
In [7]: re.search(r"^[0-9]$", "3") != None
Out[7]: False
In [8]: re.search(r"^[0-9]$", "-") != None
Out[8]: True

4)]出现在不同位置,含义不同,正则表达式将]与前面最近的[匹配

 
#未转义的]
In [9]: re.search(r"^[012]345]$", "2345") != None
Out[9]: False
 
In [10]: re.search(r"^[012]345]$", "2345]") != None
Out[10]: True
 
In [11]: re.search(r"^[012]345]$", "5") != None
Out[11]: False
 
In [12]: re.search(r"^[012]345]$", "]") != None
Out[12]: False
#转义的]
In [13]: re.search(r"^[012]345]$", "2345") != None
Out[13]: False
 
In [14]: re.search(r"^[012]345]$", "5") != None
Out[14]: True
 
In [15]: re.search(r"^[012]345]$", "]") != None
Out[15]: True

 

5)字符组简记法

常见的字符组简记法有d、w、s。从表面上看,它们与[…]完全没联系,其实是一致的。其中d等价于[0-9],其中的d代表"数字(digit)"; w等价于[0-9a-zA-Z_],其中的w代表"单词字符(word)";s等价于[ trnvf](第一个字符是空格),s表示"空白字符(space)"。

 
re.search(r"^d$", "8") != None      #  => True
re.search(r"^d$", "a") != None      #  => False
 
re.search(r"^w$", "8") != None     #  => True
re.search(r"^w$", "a") != None     #  => True
re.search(r"^w$", "_") != None     #  => True
 
re.search(r"^s$", " ") != None     #  => True
re.search(r"^s$", "t") != None    #  => True
re.search(r"^s$", "n") != None    #  => True

6)相对于d、w和s这三个普通字符组简记法,正则表达式也提供了对应排除型字符组的简记法:D、W和S--字母完全一样,只是改为大写。这些简记法匹配的字符互补:s能匹配的字符,S一定不能匹配;w能匹配的字符,W一定不能匹配;d能匹配的字符,D一定不能匹配。例1-19示范了这几个字符组简记法的应用。

 
#d和D
re.search(r"^d$", "8") != None     #  => True
re.search(r"^d$", "a") != None     #  => False
re.search(r"^D$", "8") != None     #  => False
re.search(r"^D$", "a") != None     #  => True
#w和W
re.search(r"^w$", "c") != None     #  => True
re.search(r"^w$", "!") != None     #  => False
re.search(r"^W$", "c") != None     #  => False
re.search(r"^W$", "!") != None     #  => True
#s和S
re.search(r"^s$", "t") != None    #  => True
re.search(r"^s$", "0") != None         #  => False
re.search(r"^S$", "t") != None    #  => False
re.search(r"^S$", "0") != None         #  => True

 

2.1  一般形式

 表2-1  量词的一般形式


量词

说明

{n}

之前的元素必须出现n次

{m,n}

之前的元素最少出现m次,最多出现n次

{m,}

之前的元素最少出现m次,出现次数无上限

{0,n}

之前的元素可以不出现,也可以出现,最多出现n次

(在某些语言中可以写为{,n})

2.2  常用量词

表2-2  常用量词


常用量词

{m,n}等价形式

说明

*

{0,}

可能出现,也可能不出现,出现次数没有上限

+

{1,}

至少出现1次,出现次数没有上限

?

{0,1}

至多出现1次,也可能不出现

 

 

表2-3  各类tag的匹配


匹配所有tag的表达式

tag分类

匹配分类tag的表达式

 

<[^>]+>


open tag

<[^/>][^>]*>

close tag

</[^>]+>

self-closing tag

<[^>/]+/>

注:这几个表达式不是很严谨,如匹配open tag的表达式,也可以匹配self-closing tag。作者说现有的知识还不足够解决这个问题而已,需要继续学习。

2.3  数据提取

?


1

2

3

4

5

6

7

8

9

10

In [1]: import re

 

In [2]: re.search(r"d{6}", "ab123456cd").group(0)

Out[2]: '123456'

 

In [3]: re.search(r"^<[^>]+>$", "<bold>").group(0)

Out[3]: '<bold>'

 

In [4]: re.findall(r"d{6}", "zipcode1:201203, zipcode2:100859")

Out[4]: ['201203', '100859']

2.4  点号

 

匹配除换行符外的所有字符

2.5  滥用点号的问题

因为点号能匹配几乎所有的字符,所以实际应用中许多人图省事,随意使用.*或.+,结果却事与愿违
之前介绍的量词都可以归到一类,叫做匹配优先量词(greedy quantifier,也有人翻译为贪婪量词 )。
匹配优先量词,顾名思义,就是在拿不准是否要匹配的时候,优先尝试匹配,并且记下这个状态,以备将来"反悔"。
回溯(backtracking)

 

?


1

2

3

4

re.search(r"".*"", ""quoted string" and another"").group(0)

re.search(r'".*"', '"quoted string" and another"').group(0)

re.search(r""[^"]*"", ""quoted string" and another"").group(0)

re.search(r'"[^"]*"', '"quoted string" and another"').group(0

2.6 忽略优先量词

匹配优先量词与忽略优先量词逐一对应,只是在对应的匹配优先量词之后添加?,
两者限定的元素能出现的次数也一样,遇到不能匹配的情况同样需要回溯;唯一的区别在于,
忽略优先量词会优先选择"忽略",而匹配优先量词会优先选择"匹配"。

表2-4  匹配优先量词与忽略优先量词


匹配优先量词

忽略优先量词

限定次数

*

*?

可能不出现,也可能出现,出现次数没有上限

+

+?

至少出现1次,出现次数没有上限

?

??

至多出现1次,也可能不出现

{m,n}

{m,n}?

出现次数最少为m次,最多为n次

{m,}

{m,}?

出现次数最少为m次,没有上限

{,n}

{,n}?

可能不出现,也可能出现,最多出现n次

2.7 转义


量词

转义形式

{n}

{n}

{m,n}

{m,n}

{m,}

{m,}

{,n}

{,n}

*

*

+

+

?

?

*?

*?

+?

+?

??

??
时间: 2024-09-29 01:31:47

很详细python正则表达式使用详解的相关文章

Python re(正则表达式)模块详解

一.Python中转义字符   正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\\\ "表示正则表达式中的" \ ",因为正则表达式中如果要匹配" \ ",需要用\来转义,变成" \\ ",而Python语法中又需要对字符串中每一个\进行转义,所以就变成了" \\\\ ".上面的写法是不是觉得很麻烦,为了使正则表达式具

Python itertools模块详解

  篇文章主要介绍了Python itertools模块详解,本文基本是基于文档的翻译和补充,相当于翻译了,需要的朋友可以参考下 这货很强大, 必须掌握 文档 链接 http://docs.python.org/2/library/itertools.html pymotw 链接 http://pymotw.com/2/itertools/ 基本是基于文档的翻译和补充,相当于翻译了 itertools用于高效循环的迭代函数集合 组成 总体,整体了解 无限迭代器 代码如下: 迭代器 参数 结果 例

javascript中的正则表达式使用详解_javascript技巧

[1]定义:正则又叫规则或模式,是一个强大的字符串匹配工具,在javascript中是一个对象 [2]特性: [2.1]贪婪性,匹配最长的 [2.2]懒惰性,不设置/g,则只匹配第1个 [3]两种写法: [3.1]perl写法(使用字面量形式): var expression = /pattern/flags; e.g. var pattern = /a/i;//匹配字符串中所有'a'的实例 [3.1.1]三个标志flags [a]g:表示全局模式(global) [b]i:表示不区分大小写(i

python常用函数详解_python

1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多重复的代码,这样代码重用率就比较低...并且这样的代码维护起来也是很有难度的,为了解决这些问题,就出现了函数,用来将一些经常出现的代码进行封装,这样就可以在任何需要调用这段代码的地方调用这个函数就行了. 函数的定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 代码重用 保持一致性 可扩展性 2.函数的创建 在python中函数定义的格式如下: def

正则表达式使用详解(2)

在对正则表达式有了较为全面的了解之后,我们就来看一下如何在Perl,PHP,以及JavaScript中使用正则表达式. 通常,Perl中正则表达式的使用格式如下: operator / regular-expression / string-to-replace / modifiers 运算符一项可以是m或s,分别代表匹配运算和替换运算. 其中,正则表达式一项是将要进行匹配或替换操作的模式,可以由任意字符,元字符,或定位符等组成.替换字符串一项是使用s运算符时,对查找到的模式匹配对象进行替换的字

php 正则表达式实例详解(适合初学者)

php教程 正则表达式实例详解(适合初学者) 数学公式正则表达式: (?'kh'()*([-+]){0,1}[0-9.]+(?'-kh'))*([+-*/]{1}(?'kh'()*((?<=()([-+]){0,1})?[0-9.]+(?'-kh'))*)+(?('kh')(?!)) 匹配加减乘除数学公式,如:((1+2)-3*4) (?'kh'()*([-+]){0,1}[0-9.]+(?'-kh'))*([+-*/]{1}(?'kh'()*((?<=()([-+]){0,1})?[0-9.

Docker 打包python的命令详解_docker

最近用Python写了一段爬虫程序,为了隔离其运行环境,易于分发,把项目打包成Docker镜像 Dockerfile FROM python:2.7.12-alpine ADD ./src /job CMD ["python", "/job/main.py"] 构建命令 $ docker build -t job . 运行 $ docker run -d --name job job 比较简单 以上所述是小编给大家介绍的Docker 打包python的命令详解,希望

Linux正则表达式特性详解及BRE与ERE的异同点_正则表达式

Linux正则表达式(Regular Expression)主要遵从POSIX BRE或者POSIX ERE标准.什么是POSIX呢,POSIX Portable Operating System Interface 可移植操作系统接口ERE是BRE的扩展版本,具体更强的处理能力,并增加了一些元字符(metacharactor). BRE主要的能力集有: 1) 普通字符(Literal text),如a,b,c等 2)非打印字符,包括TAB,回车,换行,回车换行(WINDOWS) 3)任意字符.

Linux正则表达式特性详解及BRE与ERE的异同点

Linux正则表达式(Regular Expression)主要遵从POSIX BRE或者POSIX ERE标准.什么是POSIX呢,POSIX Portable Operating System Interface 可移植操作系统接口ERE是BRE的扩展版本,具体更强的处理能力,并增加了一些元字符(metacharactor). BRE主要的能力集有: 1) 普通字符(Literal text),如a,b,c等 2)非打印字符,包括TAB,回车,换行,回车换行(WINDOWS) 3)任意字符.