Python 学习之路 - 正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 学习之路 - 正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式

正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。

re 模块用于正则表达式的操作。

一、 用于匹配的函数

1. findall(pattern,string,flags=0)

匹配字符串中所有符合条件的元素。匹配上,返回list类型元素

import re

obj = re.findall(\\d+,hhh90080mmmbb2233pp)
print(obj)

2. match(pattern,string,flags=0)

从字符串起始位置匹配符合条件的元素,单个匹配。匹配上,返回一个对象

注意:字符串起始位置的元素必须与正则表达式相匹配,不然返回None

import re

obj = re.match(\\d+,0008lkk)
print(obj,type(obj))
if obj:
    print(obj.group())

3. search(pattern,string,flags=0)

在字符串中寻找匹配的元素,单个匹配。匹配上,返回一个对象

import re

obj = re.search(\\d+,hhh90080mmmbb2233pp)
if obj:
    print(obj.group())

4. group()和groups()

分组是用()进行的,一个正则表达式可以用括号进行分组

group()获得一个,多个分组截获的字符串;或所有分组匹配的整体字符串

groups()以元组形式返回全部分组截获的字符串

import re

a = "123abc456ooo"

print( re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0))   #编号0代表整个匹配的子串;不填写参数时,相当于group(0)
print( re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1,2)) #指定多个参数时将以元组形式返回 (‘123‘, ‘abc‘)
print(re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2))    #指定一个参数时返回字符串 abc

print (re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups())   #(‘123‘, ‘abc‘, ‘456‘)

5. sub(pattern, repl, string, count=0, flags=0)

替换与正则表达式相匹配的字符串

import re

s = "hello world 001,789 welcome"
s_c = re.sub(\\d+,amy,s,1) #只替换一次,不填count会全部替换
print(s_c)

比str.replace()更加强大。

6. split(pattern,string,maxsplit=0,flag=0)

根据指定的正则匹配进行分割。

注意:最后一个字符匹配成功的话,会分割出一个空格

import re

n = "split1nnnnn2mmmmm3"
n_c = re.split([0-9],n,1) #最多分割一次,不填maxsplit会全部分割
print(n_c)

7. compile(strPattern[, flag])

将字符串形式的正则表达式编译为一个对象。

import re

text = "You are so cool, oo"
pattern = re.compile(r\\w*oo\\w*) #将正则表达式编译成Pattern对象
print(pattern.findall(text)) #查找所有包含oo的单词,使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None

二、匹配的语法

语法 说明 表达式实例 匹配的字符串
字符
一般字符 匹配自身 abc abc
.

匹配任意字符(除换行符)

若指定flag DOTALL,则匹配任意字符,包括换行 

a.c akc
\\ 转义字符,使其后的字符变成字面上的字符 a\\.c a.c
[...] 字符集,[a*]匹配字符是a 或 *;’[a-z]匹配a到z之间的任意字符;
[^f]匹配非 f 的任意字符;[\\d]匹配数字.
字符集中除了 - ^ \\ 外,其他特殊字符没有特殊含义
[a*]k

aK

*k

数量(用在字符或(...)之后)
* 匹配前一个字符0或无限次    
+ 匹配前一个字符1或无限次    
? 匹配前一个字符0次或1次    
{m} 匹配前一个字符m次    
{m,n} 匹配前一个字符m到n次,省略m,0到n;省略n,m到无限    
预定义字符(可以写在[]字符集中)
\\d 数字:[0-9]    
\\D 非数字:[^\\d]    
\\w 字母数字下划线:[A-Za-z0-9_]    
\\W [^\\W]    
边界匹配      
^ 匹配字符串开头 ^abc abc

$ 

匹配字符串结尾 abc$

abc

\\A        

仅仅匹配字符串开头                                                    

\\Aabc          abc
\\Z 仅仅匹配字符串结尾 abc\\Z abc
\\b 匹配\\w和\\W之间;单词的开始或结束 a\\b!bc a!bc
\\B [^\\b] a\\Bbc abc
逻辑,分组
| |代表左右表达式任意匹配一个。从左
往右匹配,左边的匹配成功便跳过右边
abc|def abc
dfe
(...) 被括起来的表达式将作为分组;分组表
达式作为一个整体,后面可以接数量。表达式
中的 | 只在该组中有效。

从表达式的左边开始没遇到一个分组的左括号,
编号就加1
(abc){2}

a(123|456)c
abcabc

a456c

 

 

三、flag

# flags
I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case
L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale
U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale
M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline
S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline
X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments

 

四、r 原生字符

正则表达式里使用"\\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\\\"表示。同样,匹配一个数字的"\\\\d"可以写成r"\\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

 

 

学习内容来自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

 















以上是关于Python 学习之路 - 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

python成长之路第三篇_正则表达式

Python 学习之路 - 正则表达式

我的Python学习之路八:正则表达式

Python学习之路 爬虫正则表示式爬去名言网

Python学习之路--Day5

Python 之路 Day5 - 常用模块学习