Python 之正则表达式 使用介绍

来源:互联网 发布:起个好的淘宝店铺名字 编辑:程序博客网 时间:2024/06/06 12:40

概述

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
接下来我们主要学习一下Python中正则表达式的使用。
参考链接:菜鸟教程

re.match函数

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

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

函数参数说明:

参数 描述 pattern 匹配的正则表达式 string 要匹配的字符串 flags re.I 是匹配对大小写不敏感、re.L 做本地化识别(local-aware)匹配 、re.M 多行匹配,影响^和$ re.S 是匹配包含换行在内的所有字符、 re.U 根据Unicode字符集解析字符,这个标志影响\w、\W、\b、\B 。 re.X 该标志通过给予你更灵活的格式以便你讲正则表达式写的更易于理解。
匹配对象的方法 描述 group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

re.search函数

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

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

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

参数说明同上。

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

re.compile函数

有时候,我们可能会在代码中大量重复使用相同的模式,这时我们可以将 正则字符串编译成正则对象,以便于复用该匹配模式 。

compile_str = "day day up,365 good good study"pattern = re.compile('(\d+)')result = re.search(pattern,compile_str)print  result.group()

365

re.findall

Python 正则表达式 re.findall 方法能够以列表的形式返回能匹配的子串
函数语法:
re.findall(pattern, string[, flags]);

import rerelink = '<a href="(.*)">(.*)</a>'info = '<a href="http://www.baidu.com">baidu</a>'cinfo = re.findall(relink,info)print cinfo[('http://www.baidu.com', 'baidu')]

检索和替换

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

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

函数参数说明:

参数 描述 pattern 匹配的正则表达式 repl 替换的字符串,也可为一个函数。 string 要被查找替换的原始字符串 count 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

repl 参数是一个函数:
以下实例中将字符串中的匹配的数字乘于 2:

#!/usr/bin/python# -*- coding: UTF-8 -*-import re# 将匹配的数字乘于 2def double(matched):    value = int(matched.group('value'))    return str(value * 2)s = 'A23G4HFD567'print(re.sub('(?P<value>\d+)', double, s))

A46G8HFD1134

正则表达式实例

1、 . 匹配任意除”\n”外的字符,在DOTALL模式中也能匹配换行符
print  re.match(r'a.c',"abcdeq").group()abcreStr1 = 'a\nc'print  re.match(r'a.c',reStr1,re.S).group()ac
2、 \ 转义字符,使后一个字符改变原来的意思。如果字符串中有字符需要匹配,可以使用* 或者字符集[]
print  re.match(r'a\.c',"a.c_a.c").group()a.cprint  re.match(r'a[.]c','a.c').group()a.c
3、[…] 字符集(字符类),对应的位置可以是字符集中任意字符,字符集中的字符可以逐个列出,也可以给出一个范围。如[abc]或[a-c],第一个字符如果是^则表示取反,如[^abc]表示不是abc的其他字符
print re.match(r'a[123]c','a1c').group()a1cprint re.match(r'a[^123]c','a4c').group()a4c
4、\d 数字[0-9] 预定义字符串,可以写在字符集[…] 中
print  re.match(r'a\dc','a1c').group()a1c
5、 \D 非数字[^0-9]
print re.match(r'a\Dc','acc').group()acc
6、\s 空白字符 [<空格>\t\r\n\f\v]
print  re.match(r'a\sc','a\tc').group()a   c
7、\S 非空白字符 [^\s]
re.match(r'a\Sc','abc').group()abc
8、 \w单词字符[0-9a-zA-Z.]
print  re.match(r'\w','0').group()0
9、 \W 非单词字符 [^\w]
print re.match(r'\W',',,').group(),
10、* 匹配前一个字符0或无限次
print  re.match(r'ab*','a').group()aprint  re.match(r'ab*','ab').group()ab
11、+ 匹配前一个字符1次或者无限次
print  re.match(r'ab+','ab').group()abprint  re.match(r'ab+','abbbbc').group()abbbb
12、? 匹配前一个字符0次或者1次
print  re.match(r'a?','ab').group()aprint  re.match(r'ab?','abbc').group()ab
13、 {m} 匹配前一个字符m次
print  re.match(r'ab{2}','abb').group()abb
14、{m,n} 匹配前一个字符m至n次(m和n可以省略,若省略m,则匹配0至n次。若省略n,则匹配m至无限次)
print re.match(r'abc{0,3}','ab').group()ab
15、^ 匹配字符串开头,在多行模式中匹配每一行的开头。
print re.match(r'^abc','abczzxxx').group()abc
16、$ 匹配字符串的末尾,在多行模式中匹配每一行的末尾。
# print  re.match(r'c$','mmmabc').group()# 原因是match()只有在开始0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none# 所以这里要使用search(),search()会扫描整个string查找匹配:print re.search(r'dc$','msdc').group()dc
17、 \A 仅匹配字符串开头
print re.match(r'\Abc','bcs').group()bc
18、\Z 仅匹配字符串末尾
print re.search(r'de\Z','ade').group()de
19、 \b 匹配\w和\W 之间
print  re.match(r'a\b!bc','a!bc').group()a!bc
20、\B [^\b]
print  re.match(r'a\Bbc','abc').group()abc
21、| 代表左右表达式任意匹配一个,它总是先尝试匹配左边的表达式,一旦匹配成功 则跳过右边的表达式
print re.match(r'abc|bcd','bcd').group()bcd
22、(….) 被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号”(” 编号加1,另外,分组表达式作为一个整体,可以后接数量词
print re.match(r'(abc){2}','abcabc').group()abcabcprint re.match(r'a(123|456)c','a123c').group()a123c
23、 (?P…) 分组,除了原有的编号外再指定一个额外的别名。
print re.match(r'(?P<id>abc){2}','abcabc').group()abcabcprint re.match(r'(?P<id>abc){2}','abcabc').group('id')abc
24、\ 引用编号为的分组匹配到的字符串
print re.match(r'(\d)abc\1','2abc2').group()2abc2print re.match(r'(\d)abc\1','5abc5').group()5abc5
25、(?P=name) 引用别名为 的分组匹配到的字符串
re.match(r'(?P<id>\d)abc(?P=id)','3abc3').group()3abc3
26、(?:….) (…)的不分组版本,用于使用”|”或后接数量词
re.match(r'(?:abc){2}','abcabc').group()abcabc
27、(?iLmsux) iLmsux 的每个字符代表一个匹配模式,只能用在正则表达式的开头 可选多个。
print  re.match(r'(?i)abc','abc').group()abc
28、 (?#….) #后的内容将作为注释被忽略
 re.match(r'abc(?#cmark)123','abc123').group() abc123
29、(?=…) =之后的字符串需要匹配表达式才能成功匹配,不消耗字符粗的内容
#后面必须是数字的aprint re.match(r'a(?=\d)','a10').group()a
30、(?!….) !之后的字符串需要不匹配表达式,才能成功
#  后面不是数字的aprint  re.match(r'b(?!\d)','bq').group()a
31、之前的字符串需要匹配表达式成功才能成功匹配
# 示例 前面是数字的qprint  re.search(r'(?<=\d)q','1q').group()q
32、(?
# 示例print  re.search(r'(?<!\d)z','zz').group()z
33、(?(id/name) yes pattern|no pattern) 如果编号为id/别名为name的组匹配到字符,则需要匹配yes.pattern 否则则需要匹配no-pattern. |no pattern可以省略
print  re.match(r'(\d)abc(?(1)\d|abc)','1abc2').group()1abc2
原创粉丝点击