Python学习笔记:re模块(正则表达式)
本文是部分内容参考自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html,虽然这篇博客是基于Python2.4的老版本,但是对于Python正则表达式还是非常全的。
1、正则表达式是用于处理字符串的功能强大的工具,但它并不是Python所独有的,许多编程语言都支持正则表达式,用法也都区别不大;
2、Python中正则表达式的应用在re模块中,re模块中的方法使用正则表达式来匹配字符串;
3、Python中的数量词默认是贪婪的,总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符(例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb";而如果使用非贪婪的数量词"ab*?",将找到"a"。);
4、与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。
5、如下是常用正则表达式语法:
语法 | 说明 | 正则表达式实例 | 匹配字符串 | 匹配结果 |
. | 匹配任意字符,除换行符“\n”外 | r'a.' | 'abc' | 'ab' |
\ |
转义字符,可以用来匹配特殊的字符 特殊字符也可以放在[]字符集中来匹配 |
r'a\*' r'a[*]' |
'a*b' 'a*b' |
'a*' 'a*' |
[]或[^...] |
字符集[],匹配字符集中的一个字符,从开始匹配直到匹配成功 开头加上“^”表示取反,即只要不是字符集中列出的字符都可匹配成功 可以在[]列出全部想要匹配的字符,也可以列出字符的范围,如[a-c]或[abc] 所有特殊字符放在字符集中都失去在正则表达式中的原有的意义 |
r'a[efg]' | 'afggg' | 'af' |
\d | 匹配单个数字字符:0到9 | r'a\d' | 'a345b' | 'a3' |
\D | 匹配非数字字符 |
r'a\D' r'a[^\d]' |
'ab3' 'ab3' |
'ab' 'ab' |
\s | 匹配空白字符:空格,\t,\r,\n,\f,\v | r'a\s' | 'a\n' | 'a\n' |
\S | 匹配非空白字符 |
r'a\S' r'a[^\s]' |
'ab' 'ab' |
'ab' 'ab' |
\w | 匹配单词字符:[a-zA-Z0-9_] | r'a\w' | 'a9' | 'a9' |
\W | 匹配非单词字符 | r'a\W' | 'a+' | 'a+' |
* | 匹配前一个字符0到无限次 | r'ab*' | 'a' | 'a' |
+ | 匹配前一个字符1到无限次 | r'ab+' | 'abbbcde' | 'abbb' |
? | 匹配前一个字符0次或1次 | r'ab?' | 'abbbcde' | 'ab' |
{m} | 匹配前一个字符m次 | r'ab{2}' | 'abbbcde' | 'abb' |
{m,n} |
匹配前一个字符m次至n次 m和n可省略,{m,}匹配前一个字符m次至无限次,{,n}匹配前一个字符0次至n次 |
r'ab{1,2}' | 'abbbbcde' | 'abb' |
*?或+?或??或{m,n}? | 使*、+、?和{m,n}的匹配变成非贪婪模式(Python默认是贪婪模式) | r'ab+?' | 'abbbcde' | 'ab' |
^ | 匹配字符串的开头(用在字符集中[]表示取反) | r'^ab' | 'abbb' | 'ab' |
$ | 匹配字符串的结尾 | r'cd$' | 'abcd' | 'cd' |
() |
括号中的内容被作为分组 ()后可以接数量词 |
r'a(def){2}b' | 'adefdefbcc' | 'adefdefb' |
| | 相当于“或”,从左到右匹配被|分隔的表达式,一旦匹配成功就不会继续往后匹配了。 | r'abb(c|d)' | 'abbdefg' | 'abbd' |
?: | 取消分组。想使用括号,但是不想它成为分组,就可以使用这个语法。 | re.findall(r'abb(?:c|d)', 'abbdefg') | 'abbd' | |
\<num> | 引用指定编号的分组结果。 | re.sub(r'a(a)b(b)', r'\2dd\1', 'aabbcc') | 'bddacc' |
re模块中的几个常用方法(pattern为正则表达式,string为需要匹配查找的字符串):
- re.compile(pattern):编译正则表达式,返回编译后的模正则表达式对象,该对象同样拥有match、search等方法。如果某个正则表达式需要多次使用,建议使用此函数先预编译正则表达式,可以提升正则表达式部分的程序性能。
- re.match(pattern, string):匹配字符串的开头,成功则返回匹配对象,否则返回None。
- re.search(pattern, string):从字符串开头开始查找匹配,直到匹配成功,则不再往后继续查找匹配,成功返回匹配对象,否则返回None。
- re.findall(pattern, string):查找匹配字符串中所有内容,返回查找成功的字符串的列表,如果字符串中没有匹配成功的内容,则返回空列表,如果pattern中有括号()分组,则列表中只返回匹配成功后的分组中的字符串内容。
- re.sub(pattern, repl, string, count=0):使用正则表达式pattern在字符串string中匹配查找,匹配查找成功后使用新字符串repl替换掉匹配成功的字符串,并返回,count为替换次数,默认0不是替换0次,而是替换所有。repl中可以使用“\<num>”形式引用pattern中的分组内容。repl也可以是函数,该函数的参数为匹配对象,且应该返回一个字符串用于替换匹配成功的字符串,具体示例见下方的代码。
- re.split(pattern, string, maxsplit=0):使用匹配成功后的字符串作为“分割符”,返回分割后的字符串列表,maxsplit为分割的次数,默认0不是分割0次,而是分割所有。建议简单的字符串分割首选字符串本身的split方法,复杂的分割才考虑正则表达式。
- re.finditer(pattern, string):返回全部查找结果的迭代器,每个迭代对象为匹配对象,可以使用group()和groups()获取匹配成功的结果,如果没有匹配成功的字符串,则返回一个空的迭代器(不是None)。
注:
- group(*args):匹配对象的group()默认返回匹配成功的整个字符串,如果正则表达式中有括号分组,可以指定返回第几个分组结果,指定时从1开始计数,比如group(2)返回匹配成功的字符串中的第二个分组结果;也可以指定返回多个分组结果,结果以元组的形式返回,比如group(1, 2, 3)以元组返回匹配成功的字符串中的第一、第二和第三个分组结果;如果正则表达式中给某个或某几个分组指定了别名,则可以使用别名来代替分组编号来获取匹配成功的对应分组结果。
- groups():匹配对象的groups()以元组的形式返回匹配成功后括号中分组的内容,相当于group(1,..., n),但是正则表达式中没有括号分组,则返回空元组,即使匹配成功,也是返回空元组。
>>> import re
>>> pattern = re.compile('python') # compile将字符串当做正则表达式来编译
>>> result = pattern.search('hello python!')
>>> result
<_sre.SRE_Match object; span=(6, 12), match='python'>
>>> result.group()
'python'
>>>
>>> # match方法
>>> result = re.match('a', 'abc') # match是从字符串的开头开始匹配
>>> result
<_sre.SRE_Match object; span=(0, 1), match='a'>
>>> result.group() # 并不直接返回匹配成功的字符串,需要使用group()方法
'a'
>>> result = re.match('a', 'dabc')
>>> result
>>> result.group() # 没有匹配成功
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
result.group()
AttributeError: 'NoneType' object has no attribute 'group'
>>>
>>> # search方法
>>> result = re.search('python', 'abcpythondef') # 在字符串的全文中搜索匹配一次,同样也不会直接返回匹配成功的字符串
>>> result
<_sre.SRE_Match object; span=(3, 9), match='python'>
>>> result.group()
'python'
>>>
>>> # findall方法
>>> result = re.findall('python', 'abc python def python ghi')
>>> result
['python', 'python']
>>> # sub方法
>>> result = re.sub('c', 'z', 'click', 1) # 使用匹配成功的字符串替换成指定的字符串,参数依次为正则表达式,匹配成功后要去替换的字符串,原字符串,替换次数
>>> result # 返回替换后的字符串
'zlick'
>>> def sub_no_use_match(match_obj): # 用不到模式对象match_obj,但是该函数必须有这个参数
return '36'
>>> re.sub(r'\d+', sub_no_use_match, 'Python27') # 以函数返回的字符串替换匹配成功的字符串
'Python36'
>>> def sub_use_match(match_obj): # 使用模式对象match_obj来返回最终的字符串
return match_obj.group() + 'hahahaha'
>>> re.sub(r'\d+', sub_use_match, 'Python27')
'Python27hahahaha'
>>>
>>> # split方法
>>> result = re.split('a', '1a2a3a4guyuyun') # 将匹配成功的字符串用作字符串分隔符,返回分隔后的字符串列表
>>> result
['1', '2', '3', '4guyuyun']
>>>
>>> # group和groups方法的区别
>>> result = re.search('(python)python(\d{1,3})', 'pythonpython22')
>>> result.groups() # groups方法是匹配pattern中括号里的格式,以元组的形式返回括号里匹配成功的字符串
('python', '22')
>>> result.group() # group是正常的匹配,返回匹配成功的字符串
'pythonpython22'
>>>
>>> string = 'python'
>>> import re
>>> result = re.search(r'(yt)h(o)', string)
>>> result
<_sre.SRE_Match object at 0x000000000293DE88>
>>> result.group()
'ytho'
>>> result.group(0) # 参数0无效
'ytho'
>>> result.group(1) # 从1开始计数
'yt'
>>> result.group(2)
'o'
>>> result.group(1, 2)
('yt', 'o')
>>>
>>> result.groups()
('yt', 'o')
>>> result.groups(0) # 传入参数无效
('yt', 'o')
>>> result.groups(1)
('yt', 'o')
>>>
>>> # finditer方法
>>> string = 'one11python, two22, three33python '
>>> result = re.finditer(r'(\d+)(python)', string)
>>> for p in result:
print(p.group())
11python
33python
>>> for p in result:
print(p.group(2))
python
python
>>> for p in result:
print(p.groups()) # 若是pattern中没有括号,则返回的是每个迭代器对应的空元组。
('11', 'python')
('33', 'python')
Python学习笔记:re模块(正则表达式)的更多相关文章
- Python学习笔记之模块与包
一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...
- Python学习笔记—itertools模块
这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...
- python学习笔记_week5_模块
模块 一.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能), 本质就是.py结尾的python文件(文件名:test.py,对应模块名:test) 包:用来从逻辑上 ...
- Python学习笔记-常用模块
1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...
- 吴裕雄--天生自然python学习笔记:Python3 正则表达式
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参 ...
- python学习笔记(八)-模块
大型python程序以模块和包的形式组织.python标准库中包含大量的模块.一个python文件就是一个模块.1.标准模块 python自带的,不需要你安装的2.第三方模块 需要安装,别人提供的. ...
- Python学习笔记1—模块
模块的使用 引用模块的两种形式 形式一: import module_name 形式二: from module1 import module11 (module11是module的子模块) 例: ...
- Python学习笔记2——模块的发布
1.为模块nester创建文件夹nester,其中包含:nester.py(模块文件): """这是"nester.py"模块,提供了一个名为prin ...
- python学习笔记十——模块与函数
第五章 模块与函数 5.1 python程序的结构 函数+类->模块 模块+模块->包 函数+类+模块+包=Python pyth ...
- Python学习笔记14—模块
在python中所有的模块都被加入到了sys.path中,用下面的方法可以看见模块的位置. >>> import sys >>> import pprint > ...
随机推荐
- CodeForces - 361A-Levko and Table (思维)
Levko loves tables that consist of n rows and n columns very much. He especially loves beautiful tab ...
- CodeForces - 1003-B-Binary String Constructing (规律+模拟)
You are given three integers aa, bb and xx. Your task is to construct a binary string ssof length n= ...
- 动态时间规整DTW
动态时间规整DTW 1 概述 动态时间规整是一个计算时间序列之间距离的算法,是为了解决语音识别领域中语速不同的情况下如何计算距离相似度的问题. 相对于用经典的欧式距离来计算相似度而言,DTW在数据点个 ...
- 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)
一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...
- Error: Trying to open unclosed connection.
错误:试图打开未关闭的连接.在我自己写model文件的时候,重复打开了连接数据库的操作,所以报这种错误. 错误实例: 两个model文件: userModel.js var mongoose = re ...
- zeplin 登录效果实现
zeplin 登录效果实现 zeplin 登录页有个效果不错,https://app.zeplin.io/login 可以看看. 主要是输入框的字会随着状态变化而变化. 我这里实现了一个自己的效果 实 ...
- 啊哈算法之宽搜BFS解救小哈
简述 本算法摘选自啊哈磊所著的<啊哈!算法>第四章第三节的题目——BFS算法再次解救小哈.文中代码使用C语言编写,博主通过阅读和理解,重新由Java代码实现了一遍,以此来理解BFS算法.关 ...
- JAVA的API部分介绍
个人理解: Object作为最大的父类,里面存在不少方法,可以在API中具体的查找.比如可以帮助查看是否相同的equals方法,不过要想看具体属性是否相同需要得重写,打印.调用对象相当于调用其tost ...
- Random类、ThreadLocalRandom类
Random和ThreadLocalRandom类均用于生成伪随机数. Random的构造函数: Random() 默认以系统当前时间为种子,相当于Random(System.currentT ...
- new() 与new
一般写的时候,new对象都要加()