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中的 ...
随机推荐
- fromCharCode vs chr
fromCharCode vs chr echo off set "fn=%*" set php=d:/www/php5/php.exe cls echo. %php% %fn% ...
- WinXP局域网共享设置
关闭局域网共享 1.不允许SAM帐户和共享的匿名枚举(系统默认是允许的). 组策略-计算机配置-Windows 设置-安全设置-本地安全策略-安全选项-网络访问:不允许SAM帐户和共享的匿名枚举. 设 ...
- Altium Designer中死铜的问题
- C++小项目-本校科协管理系统
前几天老师说让我把之前做过的一个小项目改动一下,用于新成员练手. 想到在我刚接触面向对象编程的时候,也是急需一个小的case来熟悉和深入对C++的理解.如今搞的这个东西.希望能够帮到学弟学妹们,嘻嘻. ...
- ajax日期參数格式问题
今天遇到ajax传输日期參数后台无法识别的问题,错误异常例如以下. 从异常中能够看出传输到后台的日期数据格式为Thu Aug 13 2015 19:45:20 GMT+0800 (中国标准时间),这样 ...
- 2、HZK和FreeType的使用
HZK16汉字库的使用 定义如下: unsigned char str[]="我" 在运行时str被初始化为2个字节长度,内容为“我”的GBK码,为:0xCE(区码),0xD2(位 ...
- 高效的敏感词过滤方法(PHP)
方法一: ? 1 2 3 4 5 6 7 $badword = array( '张三','张三丰','张三丰田' ); $badword1 = array_combine($badwor ...
- Shiro的Filter机制详解---源码分析(转)
Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). ...
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意: 给一个序列由 ...
- 12.2 linux USB框架分析(详细注册match匹配过程)
首先我们先来简单说一说USB的框架,之后在来具体分析源码,以便加深理解!其实USB的框架比较像“平台总线.设备.驱动”的框架,也分为总线.设备.驱动三大块.其中总线驱动是已经由内核完成的,一旦接入u ...