码迷,mamicode.com
首页 > 编程语言 > 详细

python 正则表达式基础

时间:2016-04-09 13:51:44      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

正则表达式对于初学者来说,要用好这个功能还是有点难度,也看了好久书加练习才掌握一些基础。对学到的一些东西还是写下来比较好一些,免得过几天又忘了。

常用符号:. * ? ()

常用方法: findall search sub

常用技巧

1 Python 正则式的基本用法

  Python 通过标准库re模块支持正则表达式。

>>> import re
>>> string = "XXXIXXXLoveXXX"
>>> re.findall(‘XXX(.*?)XXX‘, string)
[‘I‘]
>>> 
 

在python术语中,有两种主要方法完成模式匹配:serarching 和matching.

搜索:在字符串中任意部分中搜索匹配模式。

匹配:判断一个字符串是否能从起始位置全部或部分匹配某个模式。

 

常用正则符号字符如下图:

技术分享

a. 基本规则

‘.‘   匹配所有字符

匹配除换行符 ‘\n‘ 外的所有字符。如果使用了 ‘S‘ 选项,匹配包括 ‘\n‘ 的所有字符。要明确的匹配一个‘.‘,必须使用’\‘对它进行转义。

>>> s = """XXX
IXXX"""
>>> re.findall(.+, s)
[XXX, IXXX]
>>> re.findall(.+, s, re.S)
[XXX\nIXXX]
>>> 

b.  对基本规则作限定(闭包操作符)

‘*‘   0 或多次匹配。常用.*(贪心算法)

>>> x = "abc2323sf23"
>>> re.findall(‘c.*s‘, x)
[‘c2323s‘]
>>> 

‘+‘   1 次或多次匹配

>>> x = "abc2323sf23"
>>> re.findall(‘c\d+s‘, x)
[‘c2323s‘]
>>> 

‘?‘  0 或 1 次匹配。常用.*?(非谈心算法)

>>> x = "abc2323sf23"
>>> re.findall(‘c\d?‘, x)
[‘c2‘]
>>> re.findall(‘c\d+?‘, x)
[‘c2‘]
>>> re.findall(‘c.*?‘, x)
[‘c‘]

‘{m}‘精确匹配 m 次

‘{m,n}‘匹配最少 m 次,最多 n 次

2. ()创建组

一对()和正则表达式一起使用可达到:

  a. 对正则进行分组

  b. 匹配子组

>>> s= ‘XXXIXXXLOVEXXXYOU‘
>>> re.findall(‘XXX(.*)XXX(.*)XXX(.*)‘, s)
[(‘I‘, ‘LOVE‘, ‘YOU‘)]
>>>

 可以看到 findall 函数只返回了包含在 ’()’ 中的内容,而虽然前面和后面的内容都匹配成功了,却并不包含在结果中。

3. 常用函数

findall(pattern, string[,flags])

在目标字符串中查找符合规则的字符串。

第一个参数是规则,第二个参数是目标字符串,后面还可以跟一个规则选项。

返回结果结果是一个列表 中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到,就返回一个空列表。

常用规则选项

I       IGNORECASE 忽略大小写区别。

L   LOCAL   字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符/w ,在英文环境下,它代表[a-zA-Z0-9] ,即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配 "é" 或 "ç" 。 加上这 L 选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。

M     MULTILINE  多行匹配。在这个模式下 ’^’( 代表字符串开头 ) 和 ’$’( 代表字符串结尾 ) 将能够匹配多行的情况,成为行首和行尾标记。

当我们调用findall()方法,我们可以非常简单的得到一个所有匹配模式的 列表,而不是得到对象。

>>> string = bird cat bird, cat dog
>>> s = re.findall(rcat, string)
>>> s
[cat, cat]
>>> 

 

match 与 search

match( pattern, string, flags = 0)

search( pattern, string, flags = 0)

match函数尝试从字符串的开头开始对模式进行匹配,如果匹配成功,就返回一个匹配对象,如果失败返回空,匹配对象的group()方法可以用来显示那个成功的匹配。

search函数工作方式和match一样,这两个函数唯一的区别是: match 从字符串的开头开始匹配,如果开头位置没有匹配成功,就算失败了;而 search 会跳过开头,继续向后寻找是否有匹配的字符串。

常见例子:

 对字符串‘bird cat bird‘调用mathch()方法,查找模式‘bird‘将会匹配:

>>> re.match(rbird, cat bird cat)
>>> string = bird cat bird
>>> s = re.match(rbird, string)
>>> s
<_sre.SRE_Match object at 0x0000000003104D30>
>>> s.group()
bird
>>> s = re.match(rcat, string)
>>> s
>>> 

 但是,如果我们对同一个字符串调用math()方法,查找模式‘cat‘,则不会找到匹配。

而search()结果则不一样,search()方法会在它查找到一个匹配项之后停止继续查找,并返回其首次出现的位置。

>>> string = bird cat bird
>>> s = re.search(rcat, string)
>>> s
<_sre.SRE_Match object at 0x0000000003104D30>
>>> s.group()
cat
>>> 

 

分组示例:

即:上面提到的‘()‘号,对整个正则表达式的特定子串进行定位的能力。我们可以定义一个分组做为整个正则表达式的一部分,然后单独的对这部分对应匹配到的内容定位。

>>> string = "name: Tom, phone: 12344"
>>> s = re.findall(r(.*): (.*), phone: (\d+),string)
>>> s
[(name, Tom, 12344)]
>>> s = re.search(r(.*): (.*), phone: (\d+),string)
>>> s
<_sre.SRE_Match object at 0x0000000002F54AE0>
>>> s.group(1)
name
>>> s.group(2)
Tom
>>> s.group(3)
12344
>>> 

 

 通过用圆括号来(字符‘(’和‘)’)包围正则表达式的特定部分,可以对内容进行分组然后对这些子组做单独处理。

python 正则表达式基础

标签:

原文地址:http://www.cnblogs.com/gcm688/p/5331137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!