正则是个非常牛逼的东西,python中当然也不会缺少。
所以今天的Python就跟大家一起讨论一下python中的re模块。
re模块包括对正則表達式的支持。
什么是正则:
正則表達式是能够匹配文本片段的模式。
正則表達式’Python’能够匹配’python’
通配符
.表示匹配不论什么字符:
‘.ython’能够匹配’python’和’fython’
对特殊字符进行转义:
‘python.org’匹配‘python.org’
字符集
‘[pj]ython’能够匹配’python’和’jython’
反转字符集
‘[^abc]’能够匹配除了abc之外的不论什么字符
选择符
使用管道符号|
可选项
加上问好就变为了可选项:
r’(http://)?(www.)?python.org‘仅仅能匹配以下几种:
'http://www.python.org'
'http://python.org'
'www.python.org'
'python.org'
反复子模式
*:同意模式反复0次或多次
+:同意模式反复1次或多次
{m, n}同意模式反复m-n次
当然,正则语法规则非常多,远不止上面的这些。可是我们仅仅能点到为止了,由于这篇博客的目的是介绍Python中的模块,re模块。
re 模块使 Python 语言拥有全部的正則表達式功能。
compile 函数依据一个模式字符串和可选的标志參数生成一个正則表達式对象。
该对象拥有一系列方法用于正則表達式匹配和替换。
re 模块也提供了与这些方法功能全然一致的函数,这些函数使用一个模式字符串做为它们的第一个參数。
re中重要的函数:
compile(pattern[, flags]) 依据包括正則表達式的字符串创建模式对象
search(pattern, string[, flags]) 在字符串中寻找模式
match(pattern, string[, flags]) 在字符串的開始处匹配模式
split(pattern, string[, maxsplit=0]) 依据匹配项切割字符串
findall(pattern, string) 列出字符串中模式的全部匹配项
sub(pat, rep, string[, count=0]) 字符串中全部pat的匹配项用repl替换
escape(string) 将字符串中全部特殊表达式字符转义
以下就进行简单的应用:
使用match
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
使用search
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
这时候须要停一下,match和search的差别呢?
看看结果先:
match样例中结果:
(0, 3)
None
search样例中结果:
(0, 3)
(11, 14)
match()函数仅仅检測RE是不是在string的開始位置匹配,search()会扫描整个string查找匹配;
也就是说match()仅仅有在0位置匹配成功的话才有返回。假设不是開始位置匹配成功的话,match()就返回none。
search()会扫描整个字符串并返回第一个成功的匹配。
使用sub
Python 的re模块提供了re.sub用于替换字符串中的匹配项。
#!/usr/bin/python
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num
# Remove anything other than digits
num = re.sub(r'D', "", phone)
print "Phone Num : ", num
结果:
Phone Num : 2004-959-559
Phone Num : 2004959559
最后献上菊花:
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配随意字符。除了换行符。当re.DOTALL标记被指定时,则能够匹配包括换行符的随意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正則表達式定义的片段,非贪婪方式
re{ n}
re{ n,} 精确匹配n个前面表达式。
re{ n, m} 匹配 n 到 m 次由前面的正則表達式定义的片段,贪婪方式
a| b 匹配a或b
(re) G匹配括号内的表达式。也表示一个组
(?imx) 正則表達式包括三种可选标志:i, m, 或 x 。仅仅影响括号里的区域。
(?-imx) 正則表達式关闭 i, m, 或 x 可选标志。
仅仅影响括号里的区域。
(?
: re) 相似 (...), 可是不表示一个组
(?imx: re) 在括号里使用i, m, 或 x 可选标志
(?-imx: re) 在括号里不使用i, m, 或 x 可选标志
(?#...) 凝视.
(?= re) 前向肯定界定符。假设所含正則表達式,以 ... 表示,在当前位置成功匹配时成功,否则失败。
但一旦所含表达式已经尝试。匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式。省去回溯。
w 匹配字母数字
W 匹配非字母数字
s 匹配随意空白字符,等价于 [
f].
S 匹配随意非空字符
d 匹配随意数字,等价于 [0-9].
D 匹配随意非数字
A 匹配字符串開始
匹配字符串结束。假设是存在换行,仅仅匹配到换行前的结束字符串。c
z 匹配字符串结束
G 匹配最后匹配完毕的位置。
匹配一个单词边界,也就是指单词和空格间的位置。
比如, 'er' 能够匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
, , 等. 匹配一个换行符。匹配一个制表符。等
1...9 匹配第n个分组的子表达式。
10 匹配第n个分组的子表达式,假设它经匹配。否则指的是八进制字符码的表达式。