Python正則表達式
Python正則表達式
正則表達式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
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.match方法返回一个匹配的对象,否则返回None。
我们能够使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 | 描写叙述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 能够一次输入多个组号,在这样的情况下它将返回一个包括那些组所相应值的元组。 |
groups() | 返回一个包括全部小组字符串的元组,从 1 到 所含的小组号。 |
实例 1:
#!/usr/bin/python
# -*- coding: UTF-8 -*- import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
以上实例执行输出结果为:
(0, 3)
None
实例 2:
#!/usr/bin/python
import re line = "Cats are smarter than dogs" matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print "No match!!"
以上实例执行结果例如以下:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
re.search方法
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)
函数參数说明:
參数 | 描写叙述 |
---|---|
pattern | 匹配的正則表達式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正則表達式的匹配方式,如:是否区分大写和小写,多行匹配等等。 |
匹配成功re.search方法返回一个匹配的对象。否则返回None。
我们能够使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 | 描写叙述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串。group() 能够一次输入多个组号,在这样的情况下它将返回一个包括那些组所相应值的元组。 |
groups() | 返回一个包括全部小组字符串的元组。从 1 到 所含的小组号。 |
实例 1:
#!/usr/bin/python
# -*- coding: UTF-8 -*- import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
以上实例执行输出结果为:
(0, 3)
(11, 14)
实例 2:
#!/usr/bin/python
import re line = "Cats are smarter than dogs"; searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) if searchObj:
print "searchObj.group() : ", searchObj.group()
print "searchObj.group(1) : ", searchObj.group(1)
print "searchObj.group(2) : ", searchObj.group(2)
else:
print "Nothing found!!"
以上实例执行结果例如以下:
searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter
re.match与re.search的差别
re.match仅仅匹配字符串的開始。假设字符串開始不符合正則表達式。则匹配失败。函数返回None。而re.search匹配整个字符串,直到找到一个匹配。
实例:
#!/usr/bin/python
import re line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print "No match!!" matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
print "search --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
以上实例执行结果例如以下:
No match!!
search --> matchObj.group() : dogs
检索和替换
Python 的re模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, max=0)
返回的字符串是在字符串中用 RE 最左边不反复的匹配来替换。
假设模式没有发现。字符将被没有改变地返回。
可选參数 count 是模式匹配后替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换全部的匹配。
实例:
#!/usr/bin/python
import re phone = "2004-959-559 # This is Phone Number" # Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num # Remove anything other than digits
num = re.sub(r'\D', "", phone)
print "Phone Num : ", num
以上实例执行结果例如以下:
Phone Num : 2004-959-559
Phone Num : 2004959559
正則表達式修饰符 - 可选标志
正則表達式能够包括一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。
多个标志能够通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符 | 描写叙述 |
---|---|
re.I | 使匹配对大写和小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的全部字符 |
re.U | 依据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正則表達式写得更易于理解。 |
正則表達式模式
模式字符串使用特殊的语法来表示一个正則表達式:
字母和数字表示他们自身。一个正則表達式模式中的字母和数字匹配相同的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号仅仅有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身须要使用反斜杠转义。
因为正則表達式通常都包括反斜杠,所以你最好使用原始字符串来表示它们。
模式元素(如 r'/t'。等价于'//t')匹配相应的特殊字符。
下表列出了正則表達式模式语法中的特殊元素。假设你使用模式的同一时候提供了可选的标志參数,某些模式元素的含义会改变。
模式 | 描写叙述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配随意字符,除了换行符,当re.DOTALL标记被指定时,则能够匹配包括换行符的随意字符。 |
[...] | 用来表示一组字符,单独列出:[amk] 匹配 'a'。'm'或'k' |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正則表達式定义的片段。非贪婪方式 |
re{ n} | |
re{ n,} | 精确匹配n个前面表达式。 |
re{ n, m} | 匹配 n 到 m 次由前面的正則表達式定义的片段,贪婪方式 |
a| b | 匹配a或b |
(re) | G匹配括号内的表达式,也表示一个组 |
(?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 | 匹配随意空白字符,等价于 [\t\n\r\f]. |
\S | 匹配随意非空字符 |
\d | 匹配随意数字。等价于 [0-9]. |
\D | 匹配随意非数字 |
\A | 匹配字符串開始 |
\Z | 匹配字符串结束,假设是存在换行,仅仅匹配到换行前的结束字符串。c |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完毕的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。比如, 'er\b' 能够匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
\B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
\n, \t, 等. | 匹配一个换行符。
匹配一个制表符。 等 |
\1...\9 | 匹配第n个分组的子表达式。 |
\10 | 匹配第n个分组的子表达式。假设它经匹配。
否则指的是八进制字符码的表达式。 |
正則表達式实例
字符匹配
实例 | 描写叙述 |
---|---|
python | 匹配 "python". |
字符类
实例 | 描写叙述 |
---|---|
[Pp]ython | 匹配 "Python" 或 "python" |
rub[ye] | 匹配 "ruby" 或 "rube" |
[aeiou] | 匹配中括号内的随意一个字母 |
[0-9] | 匹配不论什么数字。
相似于 [0123456789] |
[a-z] | 匹配不论什么小写字母 |
[A-Z] | 匹配不论什么大写字母 |
[a-zA-Z0-9] | 匹配不论什么字母及数字 |
[^aeiou] | 除了aeiou字母以外的全部字符 |
[^0-9] | 匹配除了数字外的字符 |
特殊字符类
实例 | 描写叙述 |
---|---|
. | 匹配除 "\n" 之外的不论什么单个字符。要匹配包括 '\n' 在内的不论什么字符。请使用象 '[.\n]' 的模式。 |
\d | 匹配一个数字字符。
等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配不论什么空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配不论什么非空白字符。等价于 [^ \f\n\r\t\v]。 |
\w | 匹配包括下划线的不论什么单词字符。
等价于'[A-Za-z0-9_]'。 |
\W | 匹配不论什么非单词字符。等价于 '[^A-Za-z0-9_]'。 |
Python正則表達式的更多相关文章
- Python——正則表達式(2)
本文译自官方文档:Regular Expression HOWTO 參考文章:Python--正則表達式(1) 全文下载 :Python正則表達式基础 ======================== ...
- Python正則表達式小结(1)
学习一段python正則表達式了, 对match.search.findall.finditer等函数作一小结 以下以一段网页为例,用python正則表達式作一个范例: strHtml = '''& ...
- Python正則表達式:怎样使用正則表達式
正則表達式(简称RE)本质上能够看作一个小的.高度专业化的编程语言,在Python中能够通过re模块使用它.使用正則表達式,你须要为想要匹配的字符串集合指定一套规则,字符串集合能够包括英文句子.e-m ...
- python 正則表達式推断邮箱格式是否正确
import re def validateEmail(email): if len(email) > 7: if re.match("^.+\\@(\\[?) ...
- python 学习笔记 10 -- 正則表達式
零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...
- python使用正則表達式
python中使用正則表達式 1. 匹配字符 正則表達式中的元字符有 . ^ $ * + ? { } [ ] \ | ( ) 匹配字符用的模式有 \d 匹配随意数字 \D 匹配随意非 ...
- python进阶十_正則表達式(一)
近期状态一直不太好,至于原因,怎么说呢,不好说,总之就是纠结中覆盖着纠结,心思全然不在点上,希望能够借助Python的学习以及博客的撰写来调整回来,有的时候回头想一想,假设真的是我自己的问题呢,曾经我 ...
- python re 正則表達式
夜深了.敲击键盘.用CSDN整理下python re 正則表達式是含有文本和特别字符的字符串,这些文本和特别字符描写叙述的模式能够识别各种字符串. 一下我们从实例结合理论来学习理解吧... 经常使 ...
- 正則表達式re中的贪心算法和非贪心算法 在python中的应用
之前写了一篇有关正則表達式的文章.主要是介绍了正則表達式中通配符 转义字符 字符集 选择符和子模式 可选项和反复子模式 字符串的開始和结尾 ,有兴趣的能够查看博客内容. 此文章主要内容将要介绍re中的 ...
随机推荐
- VUE错误记录 - 品牌后台练习 search(); 数组 splice forEach push 箭头函数
methods:{ add(){ var car = { id: this.id, name: this.name, ctime: new Date()}; this.list.push(car); ...
- 【例题 7-5 UVA - 129】Krypton Factor
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每次枚举增加一个字符; 然后看看新生成的字符的后缀里面有没有出现连续子串就好,前面已经确认过的没必要重复确认 (枚举长度为偶数的一个 ...
- Cocos2d-x学习笔记(一)HelloWorld
原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38656755 前言 正式来公司实习已有一月,前一月主要是看了<C ...
- 微信支付v2开发(2) 微信支付账号体系
本文介绍微信支付账号体系各参数. 商户在微信公众平台提交申请资料以及银行账户资料,资料审核通过并签约后,可以获得表6-4所示帐户(包含财付通的相关支付资金账户),用于公众帐号支付. 帐号 作用 app ...
- HTTP网络协议(二)
HTTP报文内的HTTP信息 HTTP协议交互的信息被称为HTTP报文,请求端的HTTP报文叫做请求报文,响应端的叫做响应报文. HTTP为了提升传输速率,其在传输数据时,按照数据原样进行压缩传 ...
- win8.1 “服务器运行失败”的解决方法
平台:win8.1 SP1 问题:安装QQ安全管家又卸载后出现了奇怪的问题,1.在桌面点右键→个性化时,提示“服务器运行失败”.2.右键点击“这台电脑”,选择“属性”时没有反应.3.开始屏幕里随便选择 ...
- 最短路算法详解(Dijkstra/SPFA/Floyd)
新的整理版本版的地址见我新博客 http://www.hrwhisper.me/?p=1952 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkst ...
- FTP中的授权规则
在授权规则中,你可以管理自己的FTP站点以怎样的方式进行访问,比如每个进入站点的人都需要输入用户名密码.正则可以在授权规则中删除默认的配置“允许匿名用户读取”的规则. 也可以在此处,对不同的组或用户进 ...
- IOS获取preferreces偏好设置plistname名称的方法
//获取preferreces偏好设置plistname名称的方法1 -(NSArray*)loadSpecifiersFromPlistName:(NSString*)plistName targe ...
- [Angular] The Select DOM Event and Enabling Text Copy
When we "Tab" into a input field, we want to select all the content, if we start typing, i ...