re模块是python提供的正则处理标准模块
import re
re模块核心函数
方法名 | 描述 |
compile() |
将一个正则表达式编译为正则对象,提高匹配效率 rex = re.compile("\d+") |
match(pattern, string, flags=0) | 从字符串开头匹配,如果匹配成功,返回匹配对象,否则返回None, flags就是re.A、re.I、re.L、re.M、re.X... |
search(pattern, string, flags=0) | 从字符串任意处匹配,如果匹配成功,返回匹配对象,否则返回None |
fullmatch (pattern, string, flags=0) |
字符串完全匹配,如果匹配成功,返回匹配对象,否则返回None |
findall (pattern, string, flags=0) |
从字符串中找出所有匹配的子串,从左到右寻找匹配项,按照顺序返回所有匹配子串列表 |
finditer (pattern, string, flags=0) |
与findall相同,但是返回的是一个生成器 |
split (pattern, string, maxsplit=0, flags=0) |
分割字符串,根据pattern,将字符串分割成列表, 返回列表,maxsplit为最大分割次数 |
sub (pattern, repl, string, count=0, flags=0) |
替换字符串,根据pattern匹配,使用repl替换匹配部分, count为最多替换次数,如果忽略该参数,则替换所有的匹配项 |
subn (pattern, repl, string, count=0, flags=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 存在,将会尝试匹配 |
字符类
实例 | 描述 |
---|---|
[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] |
讨论区