Python 正则表达式基础

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

常用符号:. * ? ()

常用方法: 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(r'cat', 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(r'bird', 'cat bird cat')
>>> string = 'bird cat bird'
>>> s = re.match(r'bird', string)
>>> s
<_sre.SRE_Match object at 0x0000000003104D30>
>>> s.group()
'bird'
>>> s = re.match(r'cat', string)
>>> s
>>>

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

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

>>> string = 'bird cat bird'
>>> s = re.search(r'cat', 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的文章您也可能喜欢,不妨看看:

Python 的详细介绍:请点这里
Python 的下载地址:请点这里 

相关推荐