python 模块 re 正则表达式
文章目录
python 模块 re 正则表达式
1. 原理
2. 语法
2.1 数量词的贪婪模式与非贪婪模式
2.2 反斜杠的困扰
2.3 匹配模式
3. 模式
3.1 `I` IGNORECASE
3.2 `L` LOCALE
3.3 `M` MULTILINE
3.4 `S` DOTALL
3.5 `X` VERBOSE
3.6 `U` UNICODE
4. 函数 (参见 python 模块 re 文档)
4.1 compile(pattern, flags=0)
4.2 escape(pattern)
4.3 findall(pattern, string, flags=0)
4.4 finditer(pattern, string, flags=0)
4.5 match(pattern, string, flags=0)
4.6 purge()
4.7 search(pattern, string, flags=0)
4.8 split(pattern, string, maxsplit=0, flags=0)
5. demo
5.1 正则表达式包含变量
1. 原理
正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。
2. 语法
2.1 数量词的贪婪模式与非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*“如果用于查找"abbbc”,将找到"abbb"。而如果使用非贪婪的数量词"ab*?“,将找到"a”。
2.2 反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"“作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”“,那么使用编程语言表示的正则表达式里将需要4个反斜杠”\\“:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r”\“表示。同样,匹配一个数字的”\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
2.3 匹配模式
正则表达式提供了一些可用的匹配模式,比如忽略大小写、多行匹配等,这部分内容将在Pattern类的工厂方法re.compile(pattern[, flags])中一起介绍。
3. 模式
3.1 I
IGNORECASE
忽略大小写的匹配模式, 样例如下:
s = 'hello World!' regex = re.compile("hello world!", re.I) print regex.match(s).group() #output> 'hello World!' #在正则表达式中指定模式以及注释 regex = re.compile("(?#注释)(?i)hello world!") print regex.match(s).group() #output> 'hello World!'
3.2 L
LOCALE
字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9_],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配"é"或 “ç”。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。
3.3 M
MULTILINE
多行模式, 改变 ^
和 $
的行为
s = '''first line second line third line''' # ^ regex_start = re.compile("^\w+") print regex_start.findall(s) # output> ['first'] regex_start_m = re.compile("^\w+", re.M) print regex_start_m.findall(s) # output> ['first', 'second', 'third'] #$ regex_end = re.compile("\w+$") print regex_end.findall(s) # output> ['line'] regex_end_m = re.compile("\w+$", re.M) print regex_end_m.findall(s) # output> ['line', 'line', 'line']
3.4 S
DOTALL
此模式下 ‘.’ 的匹配不受限制,可匹配任何字符,包括换行符
s = '''first line second line third line''' # regex = re.compile(".+") print regex.findall(s) # output> ['first line', 'second line', 'third line'] # re.S regex_dotall = re.compile(".+", re.S) print regex_dotall.findall(s) # output> ['first line\nsecond line\nthird line']
3.5 X
VERBOSE
冗余模式, 此模式忽略正则表达式中的空白和#号的注释,例如写一个匹配邮箱的正则表达式
email_regex = re.compile("[\w+\.]+@[a-zA-Z\d]+\.(com|cn)") email_regex = re.compile("""[\w+\.]+ # 匹配@符前的部分 @ # @符 [a-zA-Z\d]+ # 邮箱类别 \.(com|cn) # 邮箱后缀 """, re.X)
3.6 U
UNICODE
使用 \w, \W, \b, \B 这些元字符时将按照 UNICODE 定义的属性.
正则表达式的模式是可以同时使用多个的,在 python 里面使用按位或运算符 | 同时添加多个模式,如 re.compile('', re.I|re.M|re.S),每个模式在 re 模块中其实就是不同的数字
print re.I # output> 2 print re.L # output> 4 print re.M # output> 8 print re.S # output> 16 print re.X # output> 64 print re.U # output> 32