最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
很详细python正则表达式使用详解
时间:2022-11-14 23:00:35 编辑:袖梨 来源:一聚教程网
第一章讲的是字符组(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 量词的一般形式
量词
|
说明
|
{n}
|
之前的元素必须出现n次
|
{m,n}
|
之前的元素最少出现m次,最多出现n次
|
{m,}
|
之前的元素最少出现m次,出现次数无上限
|
{0,n}
|
之前的元素可以不出现,也可以出现,最多出现n次
(在某些语言中可以写为{,n})
|
常用量词
|
{m,n}等价形式
|
说明
|
*
|
{0,}
|
可能出现,也可能不出现,出现次数没有上限
|
+
|
{1,}
|
至少出现1次,出现次数没有上限
|
?
|
{0,1}
|
至多出现1次,也可能不出现
|
匹配所有tag的表达式
|
tag分类
|
匹配分类tag的表达式
|
<[^>]+>
|
open tag
|
<[^/>][^>]*>
|
close tag
|
[^>]+>
|
|
self-closing tag
|
<[^>/]+/>
|
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 "^<[^>]+>$" , " ).group( 0 ) Out[ 3 ]: ' In [ 4 ]: re.findall(r "d{6}" , "zipcode1:201203, zipcode2:100859" ) Out[ 4 ]: [ '201203' , '100859' ] |
之前介绍的量词都可以归到一类,叫做匹配优先量词(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 |
两者限定的元素能出现的次数也一样,遇到不能匹配的情况同样需要回溯;唯一的区别在于,
忽略优先量词会优先选择"忽略",而匹配优先量词会优先选择"匹配"。
匹配优先量词
|
忽略优先量词
|
限定次数
|
*
|
*?
|
可能不出现,也可能出现,出现次数没有上限
|
+
|
+?
|
至少出现1次,出现次数没有上限
|
?
|
??
|
至多出现1次,也可能不出现
|
{m,n}
|
{m,n}?
|
出现次数最少为m次,最多为n次
|
{m,}
|
{m,}?
|
出现次数最少为m次,没有上限
|
{,n}
|
{,n}?
|
可能不出现,也可能出现,最多出现n次
|
量词
|
转义形式
|
{n}
|
{n}
|
{m,n}
|
{m,n}
|
{m,}
|
{m,}
|
{,n}
|
{,n}
|
*
|
*
|
+
|
+
|
?
|
?
|
*?
|
*?
|
+?
|
+?
|
??
|
??
|
相关文章
- 人们熟悉的寄居蟹属于以下哪种分类 神奇海洋11月21日答案 11-21
- 第五人格11.22共研服有什么更新 11月22日共研服更新内容介绍 11-21
- 原神恰斯卡怎么培养 11-21
- 无期迷途四星装束是谁 11-21
- 王者荣耀帝丹高中校服怎么获得 11-21
- 光遇姆明季后续版本怎么玩 11-21