刚接触了python中的re模块,由于之前没有对正则表达式进行系统性的学习,学起来很费劲,因此写下这篇博客进行积累和巩固,以备后用。
正则表达式的应用是非常广泛的,不论是在linux中还是在编程中,我们总会遇到正则表达式,借着学习python的机会,也稍微系统的学习一下正则表达式。
自己看了下正则表达式的帮助文档,也在Internet上看了一些相关的资料,网上的资料对这个介绍的还是很多的。
以下为自己的学习经历:
'*' 这个符号在通配符中是最经常使用的,我们常常用它来匹配任意的字符,在RE中也是如此,'*'表示的是:匹配0个或者多个字符。print(re.match(r'ab*', 'abb').group())
以上例子中,*表示匹配多个b结尾的字符。
'.' 这个符号是dot,点字符,表示的是:匹配任意的字符。
当:print(re.match(r'.*', 'abc\ndef').group())
表示匹配一行,添加函数 re.DOTALL时,匹配的是整个字符串,多行。print(re.match(r'.*', 'abc\ndef', re.DOTALL).group())
'+' 表示的是:匹配一个或者多个字符,说明print(re.match(r'ab+', 'abbbb'))
匹配的是一个或者多个b字符。
'?' 表示:匹配的是0个或者一个字符,说明print(re.match(r'ab?', 'abbb'))
同样会匹配上,因为abbb中包含ab,a
'^' 这个符号是caret,脱字符,表示的是:匹配一行的首字符。
说明:当print(re.findall(r'^abc', 'abc\nabc',))
匹配的是\n前面的字符串,只返回一个abc,但是如下情况的话:print(re.findall(r'^abc', 'abc\nabc', re.MULTILINE))
匹配两个abc字符串,re.MULTILINE函数,顾名思义,我们在匹配时将对多行进行匹配,所以匹配了两个abc字符。
'$' 这个符号是表示:匹配一行的尾字符。
说明:print(re.findall(r'abc\d$', 'abc1\nabc3', re.MULTILINE))
当出现re.MULTILINE时,表示匹配多行。
'\' 转义字符,这个在其他语言和环境中是经常应用的,如果添加转义的话,才不会产生歧义。
'[]' 匹配集合符号,表示匹配[]中的字符,说明:print(re.search(r'0[xX]([0-9a-fA-F]{6})', 'the hex value is 0x2378ad'))
这个语句表示匹配十六进制的数。
'{m}' 表示的是:匹配{}中的m个字符,说明:print(re.match(r'ab{3,5}', 'abbbbb').group())
表示的是:匹配3-5个b在字符串中,但是python默认会匹配5个,匹配大的个数。(贪婪模式)
说明 re.match() 和 re.search()的区别#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
返回结果:(0, 3)
None#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
返回结果:(0, 3)
(11, 14)
比较之下可以看出,两者的区别在于,是否在开始进行匹配,match为从起始位置进行匹配,而search则是不从开始匹配,(其实理解两者英文意思也可明白,一个是匹配,一个是搜索)
关于特殊的转义的说明:
\A
匹配字符串的开始。
\b
匹配空字符串(匹配位置比较容易理解),但只在单词的开头或结尾。(也作为分割字符串)一个单词是由字母数字或下划线字符组成,因此一个单词的边界是空白或者非字母
数字、不包括下划线。请注意,\b是指\w和\W之间的边界,因此确切的字符集定义取决于UNICODE和LOCALE编译标志的值。在字符范围内,\b
表示退格符,与python的字符串兼容。
\B
匹配空字符串(匹配位置比较容易理解),但当它不在单词的开始或结尾。这是和\b相反的,也受到LOCALE和UNICODE的设置影响。
\d
当UNICODE标志没有指定,匹配任何10进制数字,相当于[0-9]。带UNICODE标志时,它会匹配任何在unicode字符集中属于数字分类的字符。
\D
当UNICODE标志没有指定,匹配任何非数字字符,相当于[^0-9]。带UNICODE标志时,它会匹配任何不在unicode字符集中属于数字分类的字符。
\s
当LOCALE和UNICODE标志没有指定时,匹配任何空白字符,这相当于[ \t\n\r\f\v]。带LOCALE标志时,它将匹配当前环境定义的空白符。如果带UNICODE标志,那么将匹配任何被划分为空白符的符号。
\S
当LOCALE和UNICODE标志没有指定时,匹配任何非空白字符,这相当于[^\t\n\r\f\v]。带LOCALE标志时,它将匹配当前环境定义的非空白符。如果带UNICODE标志,那么将匹配任何不被划分为空白符的符号。
\w
当LOCALE和UNICODE标志没有指定时,匹配任何字母数字字符、下划线,这相当于[a-zA-Z0-9_]。带LOCALE标志时,它
将匹配当前环境定义的字母和[0-9_]。带UINCODE标志时,将匹配在unicode字符集里划分为字母的字符和[0-9_]。
\W
当LOCALE和UNICODE标志没有指定时,匹配任何非字母数字字符、下划线,这相当于[^a-zA-Z0-9_]。带LOCALE标志
时,它将匹配除了当前环境定义的字母、[0-9_]。带UINCODE标志时,将匹配除了在unicode字符集里划分为字母的字符、[0-9_]。
\Z
匹配字符串的结束。
以上规则比较好记忆,因为都是两两相对应的。