Python 正则表达式
一些常用的内容,均以例子代码形式给出,估计能更好更快理解(内容不全,边学边补吧)
一、原子
import re # 普通字符作为原子 string = "taoyunjiaoju" pat = "yun" rst = re.search(pat, string) print(rst) # <re.Match object; span=(3, 6), match='yun'> # 非打印字符作为原子 # \n 换行符 \t 制表符 string = '''taoyunjiaoju nihao''' # ''' '''可以用来匹配非打印字符 pat = '\n' rst = re.search(pat, string) print(rst) # <re.Match object; span=(12, 13), match='\n'>
# 通用字符作为原子 ''' \w 字母,数字,下划线 \W 除字母、数字、下划线 \d 十进制数字 \D 除十进制数字 \s 空白字符 \S 除空白字符 ''' string = '''taoyunji8 736789aoyu''' pat = '\w\d\s\d\d' rst = re.search(pat, string) print(rst) # <re.Match object; span=(7, 12), match='i8 73'>
# 原子表 string = '''taoyunji8736789aoyu''' pat = 'tao[yab]un' rst = re.search(pat, string) print(rst) # <re.Match object; span=(0, 6), match='taoyun'> # []匹配原子表中出现的任意一个字符,刚好[yab]中含有y,因此匹配到了taoyun,若是pat为[abc],此时则匹配不到 pat = 'tao[^yab]' rst = re.search(pat, string) print(rst) # None # 原子表[]中加一个 ^ 表示不匹配原子表中出现的字符,因为本例中[^yab]而string中tao后面刚好是y,所以匹配不到
二、元字符
# 元字符 ''' . 除换行符外的任意一个字符 ^ 开始位置 $ 结束位置 * 0\1\多次 + 1\多次 {n} 恰好n次 {n,}至少n次 {n, m} 至少n次,之多m次 | 模式选择符 ()模式单元 ''' import re
string = '''taoyunji5289894379aoyu''' pat = 'tao...' rst = re.search(pat, string) print(rst) # <re.Match object; span=(0, 6), match='taoyun'>
pat = '^taoyun' pat1 = '^yunji' rst = re.search(pat, string) rst1 = re.search(pat1, string) print(rst) # <re.Match object; span=(0, 6), match='taoyun'> print(rst1) # None 因为^ 是从开始位置匹配,而y不是string的开头位置
pat = 'yu$' rst = re.search(pat, string) print(rst) # <re.Match object; span=(20, 22), match='yu'>
pat = 'tao.*' rst = re.search(pat, string) print(rst) # <re.Match object; span=(0, 22), match='taoyunji5289894379aoyu'> string = '''taoyunnnnnnji5289894379aoyu''' pat = 'yun{2,8}' # 匹配n至少2次,之多8次。 而string里yun后面刚好还有大于2小于8个连续的n rst = re.search(pat, string) print(rst) # <re.Match object; span=(3, 11), match='yunnnnnn'>
三、模式修正符
# 模式修正符 ''' I 匹配是忽略大小写 M 多行匹配 L 本地化识别匹配 U 根据Unicode字符集解析字符 S 让.匹配包括换行符 ''' import re
string = "Python" pat = 'pyt' rst = re.search(pat, string, re.I) # 忽略大小写,Pyt与pyt就可以匹配了 print(rst)
四、贪婪模式和懒惰模式
import re string = 'poytnythony' pat = 'p.*y' pat1 = 'p.*?y' # 以懒惰模式匹配 rst = re.search(pat, string) # 默认是贪婪模式 print(rst) # <re.Match object; span=(0, 11), match='poytnythony'> 贪婪模式 rst1 = re.search(pat1, string) print(rst1) # <re.Match object; span=(0, 3), match='poy'> 懒惰模式
五、正则表达式函数
# 正则表达式函数 import re # 1、match string = 'poythonyhjskjsa' pat = 'p.*?y' # 懒惰模式 rst = re.match(pat, string, re.I) # match从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none print(rst) # <re.Match object; span=(0, 3), match='poy'> # 2、search 上面几个例子用的都是search()函数,re.search 扫描整个字符串并返回第一个成功的匹配。 # 3、compile()全局匹配函数,用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。 string = 'poythopnyhjskptyjsa' pat = 'p.*?y' # 懒惰模式 # 全局匹配格式re.comlipe(正则表达式).findall(数据) rst = re.compile(pat).findall(string) print(rst) # ['poy', 'pny', 'pty']
# 4、sub用于替换字符串中的匹配项。 import re phone = "2004-959-559 # 这是一个国外电话号码" # 删除字符串中的 Python注释 num = re.sub(r'#.*$', "", phone) print "电话号码是: ", num # 删除非数字(-)的字符串 num = re.sub(r'\D', "", phone) print "电话号码是 : ", num
六、匹配网址和匹配电话号码例子
# 匹配.com或.cn网址 import re string = "<a href='http://www.baidu.com'>百度首页</a>" pat = '[a-zA-Z]+://[^\s]*[.com|.cn]' rst = re.compile(pat).findall(string) print(rst) # ['http://www.baidu.com'] # 匹配电话号码 string = "fkjdsnfknk021-759815413795893fjkldsnaklg0935-583498593fmkds" pat = '\d{4}-\d{7}|\d{3}-\d{8}' rst = re.compile(pat).findall(string) print(rst) # ['021-75981541', '0935-5834985']