pythonrefinditer_python正则re模块(详细版)
Python
Python开发
Python语⾔
python 正则 re模块(详细版)
正则表达式
什么是正则表达式?
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的⼀种逻辑公式,就是⽤事先定义好的⼀些特定字符、及这些特定字符的组合,组成⼀个“规则字符串”,这个“规则字符串”⽤来表达对字符串的⼀种过滤逻辑。正则表达式是⼀种⽂本模式,该模式描述在搜索⽂本时要匹配的⼀个或多个字符串。
正则表达式可以⼲什么?
快速⾼效的查与分析字符串
进⾏有规律查⽐对字符串,也叫:模式匹配
具有查、⽐对、匹配、替换、插⼊、添加、删除等能⼒。
字符串是编程时涉及到的最多的⼀种数据结构,对字符串进⾏操作的需求⼏乎⽆处不在。⽐如我们编写爬⾍收集数据,⾸先都得到⽹页源码,但是我们要如何提取有效数据呢,这时候我们就需要使⽤正则表达式来进⾏匹配了
re模块
正则表达式是⼀个特殊的字符序列,它能帮助你⽅便的检查⼀个字符串是否与某种模式匹配。Python ⾃1.5版本起增加了re 模块,它提供Perl 风格的正则表达式模式。re 模块使 Python 语⾔拥有全部的正则表达式功能。
由于Python的字符串本⾝也⽤转义,所以要特别注意:
s = 'ABC\-001' # Python的字符串
# 对应的正则表达式字符串变成:
# 'ABC-001'
因此建议使⽤Python的r前缀,就不⽤考虑转义的问题了:
s = r'ABC-001' # Python的字符串
# 对应的正则表达式字符串不变:
# 'ABC-001'
re模块符号⼤全
正则表达式模式
模式字符串使⽤特殊的语法来表⽰⼀个正则表达式:
字母和数字表⽰他们⾃⾝。⼀个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加⼀个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配⾃⾝,否则它们表⽰特殊的含义。
反斜杠本⾝需要使⽤反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使⽤原始字符串来表⽰它们。模式元素(如 r't',等价于 \t )匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果你使⽤模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
模式描述
^
匹配字符串的开头
$
匹配字符串的末尾。
.
匹配任意字符,除了换⾏符,当re.DOTALL标记被指定时,则可以匹配包括换⾏符的任意字符。
[...]
⽤来表⽰⼀组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]
不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*
匹配0个或多个的表达式。
re+
匹配1个或多个的表达式。
re?
匹配0个或1个由前⾯的正则表达式定义的⽚段,⾮贪婪⽅式
re{ n}
匹配n个前⾯表达式。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的两个o。
re{ n,}
精确匹配n个前⾯表达式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等价于"o+"。"o{0,}"则等价于"o*"。
re{ n, m}
匹配 n 到 m 次由前⾯的正则表达式定义的⽚段,贪婪⽅式
a| b
匹配a或b
(re)
匹配括号内的表达式,也表⽰⼀个组
(?imx)
正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)
正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)
类似 (...), 但是不表⽰⼀个组
(?imx: re)
在括号中使⽤i, m, 或 x 可选标志
(?-imx: re)
在括号中不使⽤i, m, 或 x 可选标志
(?#...)
注释.
(?= re)
前向肯定界定符。如果所含正则表达式,以 ... 表⽰,在当前位置成功匹配时成功,否则失败。但⼀旦所含表达式已经尝试,匹配引擎根本没有提⾼;模式的剩余部分还要尝试界定符的右边。
(?! re)
前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功。
(?> re)
匹配的独⽴模式,省去回溯。
w
匹配数字字母下划线
W
匹配⾮数字字母下划线
s
匹配任意空⽩字符,等价于 [tnrf]。
S
匹配任意⾮空字符
d
匹配任意数字,等价于 [0-9]。
D
匹配任意⾮数字
A
匹配字符串开始
Z
匹配字符串结束,如果是存在换⾏,只匹配到换⾏前的结束字符串。
z
匹配字符串结束
G
匹配最后匹配完成的位置。
b
匹配⼀个单词边界,也就是指单词和空格间的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B
匹配⾮单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
n, t, 等。
匹配⼀个换⾏符。匹配⼀个制表符, 等
1 (9)
匹配第n个分组的内容。
10
匹配第n个分组的内容,如果它经匹配。否则指的是⼋进制字符码的表达式。
注意:表中re指的是表达式⽽不是字⾯的re这两个字母
正则表达式修饰符 - 可选标志
正则表达式可以包含⼀些可选标志修饰符来控制匹配的模式。修饰符被指定为⼀个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符描述
re.I
使匹配对⼤⼩写不敏感
re.L
做本地化识别(locale-aware)匹配
re.M
多⾏匹配,影响 ^ 和 $
re.Spython正则表达式不包含
使 . 匹配包括换⾏在内的所有字符
re.U
根据Unicode字符集解析字符。这个标志影响 w, W, b, B.
re.X
该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
正则表达式对象
re.RegexObject
repile() 返回 RegexObject 对象。
re.MatchObject
group() 返回被 RE 匹配的字符串。
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回⼀个元组包含匹配 (开始,结束) 的位置
准备知识
我们先来看看廖雪峰⽼师讲解的正则表达式:
正则表达式是⽤字符串表⽰的,所以,我们要⾸先了解如何⽤字符来描述字符。
在正则表达式中,如果直接给出字符,就是精确匹配。
使⽤特殊符号表⽰字符:⽤d可以匹配⼀个数字,w可以匹配⼀个字母或数字,例如:
'00d'可以匹配'007',但⽆法匹配'00A';
'ddd'可以匹配'010';
'wwd'可以匹配'py3'。
'.'可以匹配任意字符,所以:
'py.'可以匹配'pyc'、'py3'、'py!'等等。
要匹配变长的字符,在正则表达式中,⽤*表⽰任意个字符(包括0个),⽤+表⽰⾄少⼀个字符,⽤?表⽰0个或1个字符,⽤{n}表⽰n个字符,⽤{n,m}表⽰n-m个字符。
来看⼀个复杂的例⼦:d{3}s+d{3,8}。
我们来从左到右解读⼀下:
d{3}表⽰匹配3个数字,例如'010';
s可以匹配⼀个空格(也包括Tab等空⽩符),所以s+表⽰⾄少有⼀个空格,例如匹配' ',' '等;
d{3,8}表⽰3-8个数字,例如'1234567'。
综合起来,上⾯的正则表达式可以匹配以任意个空格隔开的带区号的电话号码。
如果要匹配'010-12345'这样的号码呢?由于'-'是特殊字符,在正则表达式中,要⽤''转义,所以,上⾯的正则是d{3}-d{3,8}。
但是,仍然⽆法匹配'010 - 12345',因为带有空格。所以我们需要更复杂的匹配⽅式。
进阶
要做更精确地匹配,可以⽤[]表⽰范围,⽐如:
[0-9a-zA-Z_]可以匹配⼀个数字、字母或者下划线;
[0-9a-zA-Z_]+可以匹配⾄少由⼀个数字、字母或者下划线组成的字符串,⽐如'a100','0_Z','Py3000'等等;
[a-zA-Z_][0-9a-zA-Z_]*可以匹配由字母或下划线开头,后接任意个由⼀个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
[a-zA-Z_][0-9a-zA-Z_]{0, 19}更精确地限制了变量的长度是1-20个字符(前⾯1个字符+后⾯最多19个字符)。
A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。
^表⽰⾏的开头,^d表⽰必须以数字开头。
$表⽰⾏的结束,d$表⽰必须以数字结束。
py也可以匹配'python',但是加上^py$就变成了整⾏匹配,就只能匹配'py'了。
re模常⽤⽅法
re.match()
re.match 尝试从字符串的起始位置匹配⼀个模式,如果不是起始位置匹配成功的话,match()就返回none。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论