请稍候,加载中....

re模块

re模块是python提供的正则处理标准模块

import re

re模块核心函数

方法名 描述
compile()

将一个正则表达式编译为正则对象,提高匹配效率

rex = re.compile("\d+")
match(patternstringflags=0) 从字符串开头匹配,如果匹配成功,返回匹配对象,否则返回None, flags就是re.A、re.I、re.L、re.M、re.X...
search(patternstringflags=0) 从字符串任意处匹配,如果匹配成功,返回匹配对象,否则返回None
fullmatch(patternstringflags=0) 字符串完全匹配,如果匹配成功,返回匹配对象,否则返回None
findall(patternstringflags=0) 从字符串中找出所有匹配的子串,从左到右寻找匹配项,按照顺序返回所有匹配子串列表
finditer(patternstringflags=0 与findall相同,但是返回的是一个生成器
split(patternstringmaxsplit=0flags=0) 分割字符串,根据pattern,将字符串分割成列表, 返回列表,maxsplit为最大分割次数
sub(patternreplstringcount=0flags=0) 替换字符串,根据pattern匹配,使用repl替换匹配部分, count为最多替换次数,如果忽略该参数,则替换所有的匹配项
subn(patternreplstringcount=0flags=0) 与sub方法一样,但是会返回替换的次数
   

匹配对象分组方法

group(num=0) - 返回整个匹配对象

  • group() - 返回整个匹配对象

  • group(N) - N为数字编号,返回编号为N的特定子组

groups(default=None) - 返回一个包含所有匹配子组的元组

如果没有成功,返回一个空元组

groupdict(default=None) - 返回一个包含所有匹配的命名子组字典

所有子组名称作为字典对象的键,如果没有匹配到,返回一个空字典

 

常用模块属性(flag)

属性 说明
re.A,re.ASCII 让 \w\W\b\B\d\D\s 和 \S 只匹配ASCII,而不是Unicode。这只对Unicode样式有效,会被byte样式忽略。相当于前面语法中的内联标志 (?a)
re.I,re.IGNORECASE 进行忽略大小写匹配,即使表达式是大写或者小写
re.L,re.LOCALE 由当前语言区域决定 \w\W\b\B 和大小写敏感匹配,不推荐使用
re.M,re.MULTILINE 设置后,^与$将匹配行的开始与末尾,而不是整个字符串的首尾,对应内联标记 (?m)
re.S,re.DOTALL 让 '.' 特殊字符匹配任何字符,包括换行符。
re.X,re.VERBOSE 如果空格+#,那么其后面的都将被作为注释,而不是字符串的一部分

正则表达式元字符

特殊字符类

实例 描述
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_]。
\W \w以外的字符。等价于 [^A-Za-z0-9_]。
\r 回车
\n 换行
\t 制表
\u unicode转义序列

表达式符号

模式 描述
字符串字面值 比如"abc"就是匹配"abc"
re1 | re2 或者re1或者re2
^ 匹配字符串的开头,相当于\A
$ 匹配字符串的末尾。相当于\Z
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
* 匹配0个或多个的表达式。
+ 匹配1个或多个的表达式。
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{ n} 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。
{ n,} 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。
{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
(...) 匹配括号内的表达式,也表示一个组
\b 匹配一个单词边界。空格,-都属于边界。例如, 'python\b' 可以匹配"python is strong" 中的 'python',但不能匹配 "pythonxp is good" 中的 'python'。
\B 匹配非单词边界。'python\B' 能匹配 "pythonxp is good" 中的 'python',但不能匹配 "python is strong" 中的 'python'。
\N N为一个整数,匹配第N个分组的内容。

扩展表示法

(?aiLmsux) 'a''i''L''m''s''u''x' 中的一个或多个) 这个组合匹配一个空字符串;这些字符对正则表达式设置以下标记 re.A (只匹配ASCII字符), re.I (忽略大小写), re.L (语言依赖), re.M (多行模式), re.S (点dot匹配全部字符), re.U (Unicode匹配), and re.X (冗长模式)。 (这些标记在 模块内容 中描述) 如果你想将这些标记包含在正则表达式中,这个方法就很有用,免去了在 re.compile() 中传递 flag 参数。标记应该在表达式字符串首位表示,比如(?i)...。
(?#...) 注释.
(?= ...) 正向前视断言。只有括号中匹配成立时,才匹配前面的部分
(?!...) 负向前视断言。只有括号中匹配不成立时,才匹配前面的部分
(?<=...) 正向后视断言。只有括号中匹配成立时,才匹配后面的部分
(?<!...) 负向后视断言
(?P<name>…) 给匹配组命名,可以通过定义的 name 来获取匹配组的。组合名必须是有效的Python标识符,并且每个组合名只能用一个正则表达式定义,只能定义一次。一个符号组合同样是一个数字组合,就像这个组合没有被命名一样
(?P=name) 反向引用一个命名组合,它匹配前面那个叫 name 的命名组中匹配到的同样的字串
(?(id/name)yes-pattern|no-pattern)

如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-patternno-pattern可选,也可以被忽略.
比如:(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$),如果不存在"<",那么匹配(\w+@\w+(?:\.\w+)+)$,否则匹配"<"(\w+@\w+(?:\.\w+)+)">".
因此:
'<user@host.com>' 或 'user@host.com'都会被匹配
'<user@host.com'
 或 'user@host.com>'不会被匹配

字符类

实例 描述
[Pp]ython 匹配 "Python" 或 "python"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符

正则表达式实例

仅供参考

实例 描述
python-xp 字面值,匹配 "python-xp".
手机号码 ^1[3|5|7|8]\d{9}
带区号电话 ^0\d{2,3}-{0,1}\d{7,8}-{0,1}\d+
021-68598378-123
电子邮箱 \w+@\w+\.\w+
网址 http[s]{0,1}://[\w/\.\-_]+
中文 [\u4e00-\u9fa5]

Python学习手册-