正则表达式

re 模块使 Python 语言拥有全部的正则表达式功能。

compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。 The special characters are:  

正则表达式模式

  模式字符串使用特殊的语法来表示一个正则表达式:

  字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

  多数字母和数字前加一个反斜杠时会拥有不同的含义。

  标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

  反斜杠本身需要使用反斜杠转义。

  由于正则表达式通常都包含反斜杠,所以最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 \\t )匹配相应的特殊字符


  "
." 匹配除换行符以外的任何字符。
   "^" 匹配字符串的开头 "$" 匹配字符串的末尾或在换行之前
   "*" 匹配前面RE的0或更多(贪婪)重复。 贪婪意味着它将匹配尽可能多的重复。
   "+" 匹配前一个RE的一个或多个(贪婪的)重复
   "?" 匹配前面RE的0或1(贪婪)*?,+?,?? 前三个特殊字符的非贪婪版本。 {m,n} 从m到n重复前面的RE {m,n}? 非贪婪版本的上述 取m。"\\" 要么转义特殊字符,要么表示特殊序列。 [] 表示一组字符。 A "^" 第一个字符表示一个补充集,相当于取反。. "|" A|B, 创建一个匹配A或B的RE。 (...) 匹配括号内的RE。 内容可以在稍后的字符串中检索或匹配 (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below). (?:...) 正则括号的非分组版本 (?P<name>...) 组匹配的子字符串可以通过名称访问。 (?P=name) 匹配前面被命名为name的组匹配的文本。 (?#...) A comment; ignored. (?=...) 如果匹配……匹配next,但不使用字符串。 (?!...) Matches if ... doesn't match next. (?<=...) 如果前面有…(必须是固定长度)。 (?<!...) 匹配,如果前面没有…(必须是固定长度)。 (?(id/name)yes|no) Matches yes pattern if the group with id/name matched, the (optional) no pattern otherwise.

\number  匹配相同数字组的内容。
\A 仅在字符串开始时匹配
\Z 只匹配字符串的末尾。
\b 匹配空字符串,但只匹配单词的开始或结束
\B 匹配空字符串,但不匹配单词的开始或结束
\d 匹配任何十进制数字;相当于集合[0-9]。 使用ASCII标记的字节模式或字符串模式。 在没有ASCII标志的字符串模式中,它将与整体匹配。 Unicode的位数
\D 匹配任何非数字字符; 相当于 [^\d].
\s 匹配任何空白字符; equivalent to [ \t\n\r\f\v] in
bytes patterns or string patterns with the ASCII flag.
In string patterns without the ASCII flag, it will match the whole
range of Unicode whitespace characters.
\S 匹配任何非空字符; 相当于 [^\s].
\w 匹配任何字母数字字符;相当于 [a-zA-Z0-9_] 用ASCII码表示的字节模式或字符串模式。 在没有ASCII标志的字符串模式中,它将匹配。
     Unicode字母数字字符的范围(字母加数字。 加上下划线)。
有了LOCALE,它将匹配set[0-9_]和定义的字符。 作为当前语言环境的字母。
\W \w的补充 也就是\w取反,^\w
\\ 匹配文字反斜杠。

functions:
match     将正则表达式模式与字符串的开头匹配。
fullmatch 将正则表达式模式与所有字符串匹配。
search 搜索一个字符串是否存在模式。
sub Substitute occurrences of a pattern found in a string.
subn 和sub一样,但也返回了替换的次数。
split 通过一个模式的出现来分割一个字符串。
findall 查找字符串中所有模式的出现。
finditer 返回一个迭代器,为每个匹配生成一个匹配对象。
compile 将模式编译为表达式对象。
purge 清除正则表达式缓存。
escape 在字符串中反斜杠所有非字母数字。

Some of the functions in this module takes flags as optional parameters:
A ASCII 对于字符串模式,做\w, \w, \b, \b, \d, \d。 匹配相应的ASCII字符类别。 (而不是整个Unicode类别,这是。 违约)。 对于字节模式,
            此标志是唯一可用的。 行为和不需要指定。
I IGNORECASE 执行不区分大小写的匹配。
L LOCALE 让\w, \w, \b, \b,依赖于当前地区。
M MULTILINE “^”匹配的开始行(换行符) 还有字符串。 “$”匹配行尾(在换行之前)。 作为字符串的末端。
S DOTALL "." 匹配任何字符,包括换行符。
X VERBOSE 忽略空白和注释,以获得更好的外观。
U UNICODE 仅供兼容性。忽略字符串模式(它。 是默认的),并且禁止使用字节模式。
 

 

re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

函数语法

re.match(pattern, string, flags=0)

函数参数说明:

参数描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.match方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
 1 #!/usr/bin/env python
 2 # -*- encoding:utf-8 -*-
 3 import re
 4 
 5 # flags
 6 # A = ASCII = sre_compile.SRE_FLAG_ASCII # assume ascii "locale"
 7 # I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case
 8 # L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale
 9 # U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode "locale"
10 # M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline
11 # S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline
12 # X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments
13 
14 
15 line = "Cat are smarter than dogs"
16 matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
17 if matchObj:
18     """
19         matchObj.group() :  Cat are smarter than dogs
20         matchObj.groups() :  ('Cat', 'smarter')
21         matchObj.group(1) :  Cat
22         matchObj.group(2) :  smarter
23         matchObj.group(1,2) :  ('Cat', 'smarter')
24     """
25     print("matchObj.group() : ", matchObj.group())
26     print("matchObj.groups() : ", matchObj.groups())
27     print("matchObj.group(1) : ", matchObj.group(1))
28     print("matchObj.group(2) : ", matchObj.group(2))
29     print("matchObj.group(1,2) : ", matchObj.group(1, 2))
30 else:
31     print("No match!!")

 

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)

函数参数说明:

参数描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.search方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

 1 #!/usr/bin/env python
 2 # -*- encoding:utf-8 -*-
 3 import re
 4 
 5 """
 6     re.match与re.search的区别
 7     re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;
 8     而re.search匹配整个字符串,直到找到一个匹配。
 9     
10     print:
11             No match!!
12             search --> matchObj.group() :  dogs
13 """
14 line = "Cat are smarter than dogs"
15 matchObj = re.match(r'dogs', line, re.M | re.I)
16 if matchObj:
17     print("match --> matchObj.group() : ", matchObj.group())
18 else:
19     print("No match!!")
20 
21 matchObj = re.search(r'dogs', line, re.M | re.I)
22 if matchObj:
23     print("search --> matchObj.group() : ", matchObj.group())
24 else:
25     print("No match!!")

 

检索和替换

Python 的re模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, count=0)

参数:

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
 1 #!/usr/bin/env python
 2 # -*- encoding:utf-8 -*-
 3 import re
 4 
 5 """
 6     pattern : 正则中的模式字符串。
 7     repl : 替换的字符串,也可为一个函数。
 8     string : 要被查找替换的原始字符串。
 9     count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
10     
11 """
12 phone = "2004-959-559 # 这是一个电话号码"
13 # 删除注释
14 num = re.sub(r'#.*$', "", phone)
15 print("电话号码 : ", num)
16 
17 # 移除非数字的内容
18 num = re.sub(r'\D', "", phone)
19 print("电话号码 : ", num)

 

posted on 2018-01-17 18:02  jovelove  阅读(93)  评论(0编辑  收藏  举报