Python学习 ——正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数
1.正则表达式修饰符 --可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式
修饰符被指定为一个可选的标志。多个标志可以通过按位OR(|)来指定。如re.I | re.M 被设置成I 和M 的标志
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
2.正则表达式模式
下图列出了Python支持的正则表达式元字符和语法(图片来自http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html)
3.re模块
1)re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法: re.match(pattern, string, flags=0)
pattern:匹配的正则表达式
string:匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.match方法返回一个匹配的对象,否则返回None。
start() | 返回匹配开始的位置 |
end() | 返回匹配结束的位置 |
span() | 返回一个元组包含匹配 (开始,结束) 的位置 |
group() | 返回被 RE 匹配的字符串 |
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
实例一:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 ''' 4 # @time : 2017/4/26 20:03 5 # @author : huange 6 # @version : 1.1 7 # @file : test2.py 8 # @Software: PyCharm 9 ''' 10 import re 11 print(re.match('www','www.hh.com').span()) # 在起始位置匹配 12 print(re.match('com','www.hh.com')) # 不在起始位置匹配 13 14 15 结果: 16 (0,3) 17 None
实例二:
1 #!/usr/bin/python3 2 import re 3 4 line = "Cats are smarter than dogs" 5 6 obj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) 7 8 if obj: 9 print ("obj.group() : ", obj.group()) 10 print ("obj.group(1) : ", obj.group(1)) 11 print ("obj.group(2) : ", obj.group(2)) 12 print(obj.start()) 13 print(obj.end()) 14 print(obj.groups()) 15 else: 16 print ("No match!!") 17 18 19 结果: 20 obj.group() : Cats are smarter than dogs 21 obj.group(1) : Cats 22 obj.group(2) : smarter 23 0 24 26 25 ('Cats', 'smarter')
2)re.search函数
re.search扫描整个字符串并返回第一个成功的匹配
函数语法: re.match(pattern,string, flags=0)
pattern:匹配的正则表达式
string:匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.search方法返回一个匹配的对象,否则返回None。
实例一:
1 import re 2 print(re.search('www','www.hh.com').span()) 3 print(re.search('com','www.hh.com').span()) 4 5 结果: 6 (0,3) 7 (7,10)
实例二:
1 #!/usr/bin/python3 2 import re 3 4 line = "Cats are smarter than dogs" 5 6 obj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) 7 8 if obj: 9 print ("obj.group() : ", obj.group()) 10 print ("obj.group(1) : ", obj.group(1)) 11 print ("obj.group(2) : ", obj.group(2)) 12 print(obj.start()) 13 print(obj.end()) 14 print(obj.groups()) 15 else: 16 print ("No match!!") 17 18 19 结果: 20 obj.group() : Cats are smarter than dogs 21 obj.group(1) : Cats 22 obj.group(2) : smarter 23 0 24 26 25 ('Cats', 'smarter')
PS:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None; re.search匹配整个字符串,直到找到一个匹配。
3)re.sub函数
re.sub用于替换字符串中匹配到的选项
函数语法:re.sub(pattern, repl, string, count=0)
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
实例一:
1 #!/usr/bin/python3 2 import re 3 phone = '135-4238-5642 # 电话号码' 4 5 # 删除注释 6 num = re.sub('#.*$','',phone) 7 print(num) 8 9 # 删除非字符 10 num = re.sub('\D','',phone) 11 print(num) 12 13 结果: 14 135-4238-5642 15 13542385642
实例二:
1 #!/usr/bin/python 2 3 import re 4 5 # 将匹配的数字乘于 2 6 def double(matched): 7 value = int(matched.group('value')) 8 return str(value * 2) 9 10 s = 'A23G4HFD567' 11 print(re.sub('(?P<value>\d+)', double, s)) 12 13 结果为: 14 A46G8HFD1134
4)re.split函数
函数语法:re.split(pattern,string,maxsplit)
按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。
1 import re 2 3 p = re.split(r'\d+','one1two2three3four4') 4 print(p)
结果:
['one','two','three','four','']
5)re.findall函数
以列表的形式返回能全部匹配到的子串
函数语法:re.findall(pattern, string ,flags):
1 import re 2 3 p = re.findall(r'\d+','one1two2three3four4') 4 print(p) 5 6 结果: 7 ['1','2','3','4']