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中的 ...
随机推荐
- 2.1 使用eclipse4.4 搭建 maven简单结构项目。
1.前言 1.本博客面向0基础开发人员. 2.本博客为系列博客.<1.X>系列为服务器数据库相关技术,前几章为简单搭建linux+tomcat+mysql+nginx+redis.< ...
- 转 openssl 建立服务器证书
openssl 建立服务器证书 ## 1,建立目录和文件 set path=D:/openssl/bin D: cd D:/openssl/conf/ ren ope ...
- python相关系数
皮尔逊相关系数: 用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间. 几组的点集,以及各个点集中和之间的相关系数.我们可以发现相关系数反映的是变量之间的线性关系和相关性的方向(第一排 ...
- GO语言学习(十五)Go 语言指针
Go 语言指针 Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 接下来让我们来一步步学习 Go 语言指针. 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地 ...
- WebService学习总结(2)——WebService是什么?
一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...
- Undo表空间数据文件损坏
UNDO表空间数据文件和system表空间数据文件都是数据库的关键数据文件,如果损坏会导致sql执行失败,用户无法登录,甚至实例崩溃等.同样恢复UNDO表空间数据文件也必须在数据库mount状态 ...
- UVA 11136 - Hoax or what (可以提交了,不会Submission error了)
看题传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- mysql三种带事务批量插入
原文:mysql三种带事务批量插入 c#之mysql三种带事务批量插入 前言 对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到 ...
- JAVA中正則表達式总结(具体解释及用途)
很多语言,包含Perl.PHP.Python.JavaScript和JScript,都支持用正則表達式处理文本,一些文本编辑器用正則表達式实现高级"搜索-替换"功能.所以JAVA语 ...
- 36、ALSA声卡驱动和应用
(注意:内核上电的时候会把一些没运行的控制器模块的时钟都关掉,所有在写驱动的时候需要在使用的使用使用clk_get和clk_enable使能时钟) (说明:与ALSA声卡对应的是OSS架构,第二期视频 ...