您的位置:首页 > 编程语言 > Python开发

python正则表达式

2016-01-15 13:21 597 查看
正则表达式定义:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。

正则表达式在处理文本的过程中非常重要。下面我们来学习下python中的正则表达式的基本用法:

首先,python语言用反斜杠’\’作为转义字符,常见的转义字符如下:

转义字符描述
\(在行尾时)续行符
\\反斜杠符号
\’单引号
\”双引号
\a响铃
\b退格(Backspace)
\e转义
\000
\n换行
\v纵向制表符
\t横向制表符
\r回车
\f换页
\oyy八进制数yy代表的字符,例如:\o12代表换行
\xyy十进制数yy代表的字符,例如:\x0a代表换行
\other其它的字符以普通格式输出
比如,我们 print ‘\thello’  输出结果:  hello,即’一个tab+hello’,而不是’\thello’

那么我们如果不想输出转义字符,而是按字符串输出该怎么办?

以前的规则是在转义字符前面加’\’取消转义,所以,用print ‘\\thello’  输出结果:\thello,是可以的。

再假如我们要匹配字符串中的’\section’,又该怎么办?

字符      阶段

\section    要匹配的字符串

\\section    按以前的规则加’\’取消转义,python中的语法re.compile(“\\section”)

“\\\\section”   但是按照python的语法,反斜杠’\’是用’\\’来表示的,所以要写成:re.compile(“\\\\section“)

可见这种写法很不方便,于是有了字符串前面加r的规则:比如r”\n”,就表示’\’和’n’两个字符,而不是转义字符了,’\n’则是一个字符,表示换行。

常规字符串   r字符串

“ab*”     r”ab*”

“\\\\section”   r”\\section”

“\\w+\\s+\\1”   r”\w+\s+\1”

下面正式开始学习python中的正则表达式:

python中的正则字符及其使用说明:

![这里写图片描述](http://images.cnitblog.com/blog/512692/201308/25163537-dbf5746f351b42e39d36ce8fc4a3578e.png)

我们首先考察的元字符是”[” 和 “]”。它们常用来指定一个字符类别,所谓字符类别就是你想匹配的一个字符集。字符可以单个列出,也可以用“-”号分隔的两个给定字符来表示一个字符区间。例如,[abc] 将匹配”a”, “b”, 或 “c”中的任意一个字符;也可以用区间[a-c]来表示同一字符集,和前者效果一致。如果你只想匹配小写字母,那幺 RE 应写成 [a-z].

元字符在类别里并不起作用。例如,[akm]将匹配字符"a","k","m",或"” 中的任意一个;”$”通常用作元字符,但在字符类别里,其特性被除去,恢复成普通字符。

你可以用补集来匹配不在区间范围内的字符。其做法是把”^”作为类别的首个字符;其它地方的”^”只会简单匹配 “^”字符本身。例如,[^5] 将匹配除 “5” 之外的任意字符。

也许最重要的元字符是反斜杠”“”。 做为 Python 中的字符串字母,反斜杠後面可以加不同的字符以表示不同特殊意义。它也可以用于取消所有的元字符,这样你就可以在模式中匹配它们了。举个例子,如果你需要匹配字符 “[” 或 “”“,你可以在它们之前用反斜杠来取消它们的特殊意义: “[ 或 “”。

一些用 “”” 开始的特殊字符所表示的预定义字符集通常是很有用的,象数字集,字母集,或其它非空字符集。下列是可用的预设特殊字符:

\d 匹配任何十进制数;它相当于类 [0-9]。

\D 匹配任何非数字字符;它相当于类 [^0-9]。

\s 匹配任何空白字符;它相当于类 [ “t”n”r”f”v]。

\S 匹配任何非空白字符;它相当于类 [^ “t”n”r”f”v]。

\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。

\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。 这样特殊字符都可以包含在一个字符类中。如,[“s,.]字符类将匹配任何空白字符或”,”或”.”。

本节最後一个元字符是 . 。它匹配除了换行字符外的任何字符,在 alternate 模式(re.DOTALL)下它甚至可以匹配换行。”.” 通常被用于你想匹配“任何字符”的地方。

重复 正则表达式第一件能做的事是能够匹配不定长的字符集,而这是其它能作用在字符串上的方法所不能做到的。 不过,如果那是正则表达式唯一的附加功能的话,那么它们也就不那么优秀了。它们的另一个功能就是你可以指定正则表达式的一部分的重复次数。

我们讨论的第一个重复功能的元字符是 *。* 并不匹配字母字符 “*”;相反,它指定前一个字符可以被匹配零次或更多次,而不是只有一次。

举个例子,ca*t 将匹配 “ct” (0 个 “a” 字符), “cat” (1 个 “a”), “caaat” (3 个 “a” 字符)等等。RE 引擎有各种来自 C 的整数类型大小的内部限制,以防止它匹配超过2亿个 “a” 字符;你也许没有足够的内存去建造那么大的字符串,所以将不会累计到那个限制。

象 * 这样地重复是“贪婪的”;当重复一个 RE 时,匹配引擎会试着重复尽可能多的次数。如果模式的後面部分没有被匹配,匹配引擎将退回并再次尝试更小的重复。

一步步的示例可以使它更加清晰。让我们考虑表达式 a[bcd]*b。它匹配字母 “a”,零个或更多个来自类 [bcd]中的字母,最後以 “b” 结尾。现在想一想该 RE 对字符串 “abcbd” 的匹配。

Step Matched Explanation

1 a a 匹配模式

2 abcbd 引擎匹配 [bcd]*,并尽其所能匹配到字符串的结尾

3 Failure 引擎尝试匹配 b,但当前位置已经是字符的最後了,所以失败

4 abcb 退回,[bcd]*尝试少匹配一个字符。

5 Failure 再次尝次b,但在当前最後一位字符是”d”。

6 abc 再次退回,[bcd]*只匹配 “bc”。

7 abcb 再次尝试 b ,这次当前位上的字符正好是 “b”

RE 的结尾部分现在可以到达了,它匹配 “abcb”。这证明了匹配引擎一开始会尽其所能进行匹配,如果没有匹配然後就逐步退回并反复尝试 RE 剩下来的部分。直到它退回尝试匹配 [bcd] 到零次为止,如果随後还是失败,那么引擎就会认为该字符串根本无法匹配 RE 。

另一个重复元字符是 +,表示匹配一或更多次。请注意 * 和 + 之间的不同;*匹配零或更多次,所以根本就可以不出现,而 + 则要求至少出现一次。用同一个例子,ca+t 就可以匹配 “cat” (1 个 “a”), “caaat” (3 个 “a”), 但不能匹配 “ct”。

还有更多的限定符。问号 ? 匹配一次或零次;你可以认为它用于标识某事物是可选的。例如:home-?brew 匹配 “homebrew” 或 “home-brew”。

最复杂的重复限定符是 {m,n},其中 m 和 n 是十进制整数。该限定符的意思是至少有 m 个重复,至多到 n 个重复。举个例子,a/{1,3}b 将匹配 “a/b”,”a//b” 和 “a///b”。它不能匹配 “ab” 因为没有斜杠,也不能匹配 “a////b” ,因为有四个。

你可以忽略 m 或 n;因为会为缺失的值假设一个合理的值。忽略 m 会认为下边界是 0,而忽略 n 的结果将是上边界为无穷大 – 实际上是先前我们提到的 2 兆,但这也许同无穷大一样。

细心的读者也许注意到其他三个限定符都可以用这样方式来表示。 {0,} 等同于 *,{1,} 等同于 +,而{0,1}则与 ? 相同。如果可以的话,最好使用 *,+,或?。很简单因为它们更短也再容易懂。

python中用re模块可以很方便的书写正则:

import re
pattern=re.compile(r'hello')
match=pattern.match('hello world')
if match:
print match.group()
input()


这是一个很简单的例子,看了下面的介绍自然就明白了。
re模块中比较常用的方法有:

方法/属性作用返回结果
match()确定re是否在字符串刚开始的地方匹配否,返回none,是返回一个MatchObject实例
search()扫描字符串,找到这个re在字符串中匹配的位置,应该是第一个匹配的位置否,返回none,是返回一个MatchObject实例
findall()扫描整个字符串,找到re所有匹配的字串按列表返回
finditer()扫描整个字符串,找到re所有匹配的字串按迭代器返回
MatchObject实例有很重要的方法/属性,比如group(),返回被re匹配的字串,默认匹配的最后一个;start(),返回匹配的开始位置;end(),返回匹配的结束位置;span(),返回匹配的开始结束位置。

如何理解转义字符:C中定义了一些字母前加”\”来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符。上面我们也已经列出了python中的转义字符,所以

在正则中如果有遇到和这些转义字符冲突的时候就需要注意了。

p=re.findall(‘\d’,’s5s6f7d8’)  输出[‘5’,’6’,’7’,’8’],是正确的;

p=re.findall(‘\\d’,’s5s6f7d8’)  输出结果和上面一样;

p=re.findall(r’\d’,’s5s6f7d8’)  输出结果和上面一样。(推荐)

虽然,三种格式输出结果都是一样的,但是还是推荐第三种方式。

group()的使用:

import re
p=re.match(r'(\w+) (\w+)(?P<sign>.*)','hello world!')
print p.group()
print p.group(1)
print p.group(2)
print p.group('sign')
input()


输出结果:

hello world!

hello

world

!

这是有括号作为参数的时候,返回匹配到的一个或者多个子组。如果是一个参数,那么结果就是一个字符串,如果是多个参数,那么结果就是一个参数一个item的元组。

group()参数的默认值为0(将返回所有的匹配值).如果group()参数为0,相对应的返回值就是全部匹配的字符串,如果group()参数的值是[1…99]范围之内的,那么将匹配对应括号组的字符串。

如果是p=re.findall(r’\w+ \w+.*’,’hello world’)

参数没有括号分开,则不能用p.group(1)这样输出,参数只能是0。

还有很多其它的重要方法,有时间再补充。

原帖:http://www.cnblogs.com/nannanITeye/p/3281372.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  正则表达式