RE 模块介绍
正则表达式(RE)用作于处理文件和数据,为高级文本模式匹配,以及搜索-替代等功能提供基础。 实质就是一些由字符和特殊符号(元字符:metacharacter)组成的字符串,它们描述了这些字符和字符的某种重复方式,因此能按某种模式匹配一个有相似特征的字符串的集合,也能按某种模式匹配一系列有相似特征的字符串,我们称为模式匹配 (patten match)。 在python中, pattern-match 有两种主要方式完成: 搜索(search)和匹配(match)。 搜索,在字符串任意部分中搜索匹配的模式;匹配,判断一个字符串能否从起始处全部或部分的匹配某个模式。
静态匹配: 自己匹配自己。
动态匹配:涉及以下metacharacter
元字符表 metacharacter
source: python 核心编程(3rd version)
符号 | 描述 | 正则表达式 | 匹配的字符串 |
使用择一匹配多个正则表达式模式,也称为union 或 Logical OR | |||
re1|re2 | 匹配正则表达式re1或re2 | bat|bet|bit | bat、bet、bit |
匹配任意单个字符 | |||
. |
匹配任何字符(除了\n之外), 包括字母、数字、空格(并不包括“\n”换位符)、可打印和不可打印字符。 显示句点符号本身,需要用”\.“ 当 flag是re.DOTALL标记,则\n也可匹配 |
f.o | 匹配在字母“f”和“o”之前任意一个字符;例如fao,f9o,f#o |
.. | 任意两个字符 | ||
.end | 匹配在字符串“end”之前的任意一个字符 | ||
从字符串起始或者结尾或者单词边界匹配 | |||
^或\A | 匹配字符串起始部分 | ^Dear | 任何以Dear作为起始的字符串 |
$或\Z | 匹配字符串终止部分 | /bin/tesh$ | 任何以/bin/tesh作为结尾的字符串 |
^Subject:hi$ | 任何由单独的字符串Subject:hi构成的字符串 | ||
\bBb | 匹配一个单词的边界 | \bthe | 任何以the开始的字符串 |
\bthe\b | 仅仅匹配单词the | ||
\B | 匹配出现在一个单词中间的模式 | \Bthe | 任何包含但并不以the作为起始的字符串 |
创建字符集,限定范围和否定 | |||
[...] | 匹配来自字符集的任意单一字符 | b[aeiu]t | bat、bet、bit、but |
[cr][23][dp][o2] | 一个包含四个字符的字符串,例如c2do\r3p2等 | ||
[..x-y..] | 匹配x~y范围中的任意单一字符 | z.[0-9] | 字母"z"后跟着任何字符,然后跟着一个数字 |
[^...] | 不匹配此字符集]中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现) | [^aeiou] | 一个非元音字符,不匹配a,e,i,o,或u |
[^\t\n] | 不匹配制表符\t或\n | ||
使用闭包操作符实现存在性和频数匹配 | |||
* | (其左边)匹配0次或者多次前面出现的正则表达式 - Kleene闭包 (贪婪模式) | [A-Za-z0-9]* | |
+ | 匹配1次或者多次前面出现的正则表达式 - 正闭包操作符 (贪婪模式) | [a-z]+\.com | |
? | 匹配0次或者1次前面出现的正则表达式 (非贪婪模式) | [dn]ot? | t出现一次或者不出现,即do,no,dot,not |
</?[^>]+> | 匹配全部有效(和无效的)HTML标签 | ||
{} | {N}精确匹配N次前面出现的正则表达式;{M,N}匹配M~N次前面出现的正则表达式 | [0-9]{15,16} | 匹配15或者16个数字(例如信用卡号码) |
表示字符集的特殊字符 | |||
\d | 匹配任何十进制数字, 等于[0-9] | \d{3}-\d{3}-\d{4} | 美国电话号码的格式 |
\D | 不匹配任何非数值型的数字, 等于[^0-9] | ||
\w | 匹配任何字母数字字符,等于[A-Za-z0-9] | \w+@\w+\.com | 以XXX@YYY.com格式表示的简单电子邮件地址 |
\W | 不匹配任何字母数字,等于[^A-Za-z0-9] | ||
\s | 匹配任何空格字符,等于[\n\t\r\v\f] (\S与之相反) | ||
使用圆括号指定分组 | |||
(...) | 匹配()里的正则表达式,也表示一个子组; 用groups来体现 | \d+(\.\d*)? | 表示简单浮点数的字符串;也就是说,任何十进制数字,后面可以接一个小数点和零个或者多个十进制数字 |
(Mr?s?\.)?[A-Z][a-z]*[A-Za-z-]+ | 名字和姓氏, 以及对名字的限制(如果有,首字母大写,后续小写),全名前可以有可选"Mr.""Mrs.""Ms。"或”M“作为称谓。以及灵活可选的姓氏,可以有多个单词、横线以及大写字母 | ||
扩展表示法 | |||
(?...) | 在判断匹配之前提供标记,实现一个前视(或者后视)匹配或者条件检查;不会保存为子组,除了(?P<name>)表示为一个分组匹配 | ||
(?:...) | 类似(...),但是不保存为子组 | (?:\w+\.)* | 以句点作为结束的字符串,列如:"google." , "twitter."等,但是这些匹配不会保存下来供后续使用 |
(?iLmsux) | 在正则表达式中嵌入一个或者多个特殊“标记“参数(或者通过函数/方法 | (?x) | |
(?#...) | 表示注释,所有内容都被忽略 | (?#comment) | 不做匹配,只是注释 |
(?=...) | 匹配条件是如果...出现在之后的位置,而不使用输入字符串;称作正向前视断言 | (?=.com) | 如果一个字符串后面跟着”.com“才做匹配,并不使用任何目标字符串 |
(?!...) | 匹配条件是如果...不出现在之后的位置,而不使用输入字符串;称作负向前视断言 | (?!.net) | 如果一个字符串后面不是跟着”.net“才做匹配 |
(?<=...) | 匹配条件是如果...出现在之前的位置,而不使用输入字符串;称作正向后视断言 | (?<=800-) | 字符串之前为"800-"才匹配, 同样,并不使用任何目标字符串 |
(?<!...) | 匹配条件是如果...出现在之前的位置,而不使用输入字符串;称作负向后视断言 | (?<!192\.168\.) | 字符串非”192.168“才做匹配,假定用于过滤掉一组C类IP地址 |
(?(id/name)Y|N) | 如果分组所提供的id或name(名称)存在,就返回正则表达式的条件匹配Y,如果不存在,就返回N; |N是可选项 | (?(1)y|x) | 如果一个匹配组1(\1)存在,就与y匹配;否在就与x匹配 |
常用函数
re.group() 和 re.groups()
re.group() 返回整个匹配对象,或返回特定子组
re.groups() 返回一个包含唯一或者全部子组的元祖
re.match(): 匹配
re.match(”模式“,"字符串"): 试图从字符串的起始部分对模式进行匹配。如果匹配成功,返回一个匹配对象;如果失败,就返回None。 如果匹配失败,会抛出AttributeError异常,所以一般我们用下面方法防止捕捉错误。
m = re.match("foo", "foo")
if m is not None:
m.group()
re.match("bat|bet|bit“, "bat") # 匹配多个字符串
re.match(".end", "bend") # ”.“ 除了换行符及非字符之外,所有的字符
re.search() :搜索
用法和match 完全一致,不过search 搜索模式在字符串中第一次出现的位置,并且严格地字符串从左到右搜索
re.findall() & re.finditer():查询
findall 查询字符串中某个re模式全部的非重复出现情况。 把所有匹配到的字符放到以列表中的元素范围。 子组搜索是允许从当个正则表倒式抽取特定模式,多个子组匹配成功,每组成功匹配为返回列表中的一个元祖,每个成功匹配为元祖中的一个元素。
finditer比findall更节省内存。 finditer在匹配对象中迭代,不返回所有。
import re
s = "This and that. thus and thin"
findall = re.findall(r'(th\w+) and (th\w+)', s, re.I) # 返回[('This', 'that'), ('thus', 'thin')]
print(findall)
# 返回[('This', 'that'), ('thus', 'thin')]
finditer = re.finditer(r'(th\w+) and (th\w+)', s, re.I)
print(finditer)
# 返回<callable_iterator object at 0x0000020904E53748>
# 依次打印元素
for g in finditer:
print(g.groups())
re.sub() & re.subn():搜索替换
匹配并进行某种形式的替换。 subn比sub多返回一个表示替换的总数
re.split() 分隔
re.split() 正则表达式的模式分隔字符串。 可以通过max设定最大分隔数。
re.complile() 编译
模块常用属性
re模块属性 | 描述 |
re.I | 不区分大小写的匹配、 |
re.IGNORECASE | |
re.L | 根据所使用的语言环境通过\w、\W、\b、\B、\s、\S实现匹配 |
re.LOCALE | |
re.M | ^和$分别匹配目标字符串中行的起始和结尾,而不是严格匹配整个字符串的起始和结尾 |
re.MULTILINE | |
re.S | “.”(点号)通常匹配除了\n(换行符)之外的所有单个字符;该标记表示"."(点好)能够匹配全部字符 |
re.DOTALL | |
re.X | 通过反斜线转义,否在所有空格加#都被忽略,除非在一个字符类中或者允许注释并提高可读性 |
re.VERBOSE |