python正则表达式教程_Python正则表达式简明教程

python 语言对于字符串匹配及其他更为复杂的字符串处理,就需要使用正则表达式。正则表达式是一个特殊的字符序列,使用正则表达能很方便地在文中查找和匹配字符串模式。Python 自 1.5 版本起增加了 re 模块,re 模块使 Python 语言拥有全部的正则表达式功能。

单条正则表达式通常被称作 regex,它是根据正则表达式语言编写的字符串。Python 内置的 re 模块用于操作 regex 对象。只有使用 import re 语句,先导入 re 模块,才能使用正则表达式。re 模块所提供的函数分为 3 类:模式匹配、替换和拆分。下面将主要介绍 Python 中常用的正则表达式处理函数。

1. compile() 函数

compile() 函数用于编译正则表达式,生成一个正则表达式 (Pattern) 对象,供 match() 和 search() 这两个函数使用,其语法格式如下:

re.compile(pattern[,flags])

该函数参数说明如下:

pattern:表示一个字符串形式的正则表达式;

flags:可选,表示匹配模式,如忽略大小写、多行模式等,具体参数见正则表达式修饰符 flags 参数。

re.compile() 函数返回值为 RegexObject 对象。

2. 正则表达式对象

正则表达式对象也称为 RegexObject 对象。

1) 正则表达式修饰符

正则表达式修饰符——标志(flags)参数见表 1。

表 1:正则表达式修饰符——标志(flags)参数

参数

说明

re.l

使匹配对大小写不敏感

re.L

做本地化识别 (locale-aware) 匹配

re.M

多行模式,影响“^”和“$”

re.S

使 "." 匹配包括换行在内的所有字符,除了换行符外

re.U

根据 Unicode 字符集解析字符。这个标志影响“\w”“\W”“\b” “\B”

re.X

为了增加可读性,忽略空格和“#”后面的注释

2) 正则表达式模式

正则表达式模式是使用特殊的语法来表示一个正则表达式,它的规则如下:

正则表达式模式中的字母和数字匹配相同的字符串。

多数字母和数字前加一个反斜杠时会拥有不同的含义。

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,如模式元素 r'\t',等价于 '\\t'。因此,正则表达式中一般都使用 r'…'(raw 字符串)来定义规则字符串。

正则表达式模式语法中的特殊元素见表 2,如果使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

表 2:正则表达式模式语法中的特殊元素

模式

说明

^

匹配字符串的开头

$

匹配字符串的末尾

.

匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符

[...]

用来表示一组字符,单独列出,例如 [amk]匹配 'a'、'm' 或 'k'

[^...]

不在 [] 中的字符,例如[^abc]匹配除了 a、b、c 之外的字符

re*

匹配 0 个或多个的表达式

re+

匹配 1 个或多个的表达式

re?

匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式

re{n}

精确匹配 n 个前面表达式。例如,o{2} 不能匹配 “Boy”中的“o”,但是能匹配“foot”中的两个“o”

re{n,}

匹配 n 个前面表达式。例如,o{2,}不能匹配"Boy”中的“o”,但能匹配"fooooot”由的所有“o”。 o{1,}等价于"o+”,o{0,}则等价于"o*”

re{n,m}

匹配 n~m 次由前面的正则表达式定义的片段,贪婪方式

a|b

匹配 a 或 b

(re)

匹配括号内的表达式,也表示一个组

(?imx)

正则表达式包含3种可选标志: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

匹配任意非数字

\Z

匹配字符串结束,如果存在换行,只匹配到换行前的结束字符串

\z

匹配字符串结束

\G

匹配最后匹配完成的位置

\b

匹配一个单词边界,也就是指单词和空格间的位置,例如,'er\b' 可以匹配“never”中的"er”,但不 能匹配“verb”中的“er”

\B

匹配非单词边界,"er\B”能匹配“verb”中的“er”,但不能匹配“never”中的"er"

\n, \t

匹配一个换行符,匹配一个制表符

\1...\9

匹配第 n 个分组的内容

3. re.match() 函数

re.match() 函数尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 None。其语法格式如下:

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

该函数参数说明如下:

pattern:表示匹配的正则表达式;

string:表示要匹配的字符串;

flags:标志位,用于控制正则表达式的匹配方式,例如:是否区分大小写,多行匹配等,具体见表 1。

函数返回值为 match() 函数从字符串开头开始匹配,匹配成功 re.match() 函数返回一个匹配的对象。如果第一个字符就不匹配,它不会再搜索字符串内部。如果没能找到任何匹配的子串,将返回 None。

match() 函数可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

示例代码 example1.py 如下。

# -*- coding: utf-8 -*-

import re

# 在起始位置匹配,匹配对大小写不敏感

print(re.match(r'(w*)', 'WWW.baidu.com',re.I).span())

print(re.match(r'[com]', 'www.baidu.com')) #没有匹配

str = "#this is String example##"

pattern = re.compile(r'(.*) is (.*)')

m_Obj = re.match(pattern, str)

if m_Obj:

print('m_Obj.group():', m_Obj.group())

print('m_Obj.group(1):', m_Obj.group(1))

print('m_Obj.group(2):', m_Obj.group(2))

else:

print('No match!!')

str1 = "www.sina.com,www.163.com"

pattern = re.compile(r'(\D*\d*)')

m_Obj = re.match(pattern, str1)

print('m_Obj.group():', m_Obj.group())

4. re.search() 函数

re.search() 函数扫描整个字符串并返回第一个成功的匹配。其语法格式如下:

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

该函数参数说明如下:

pattern:表示匹配的正则表达式;

string:表示要匹配的字符串;

flags:标志位,用于控制正则表达式的匹配方式,例如:是否区分大小写,多行匹配等,具体见表 1。

函数返回值为匹配成功 re.search() 函数返回一个匹配的对象, 否则返回 None。

与 match() 函数相同,search() 函数也可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

示例代码 example2.py 如下。

# -*- coding: utf-8 -*-

import re

print(re.search(r'(w*)', 'www.baidu.com').span()) # 在起始位置匹配

print(re.search(r'[com]', 'www.baidu.com').span()) # 不在起始位置匹配

str1 = "www.163.com,www.51job.com"

pattern = re.compile(r'\d{3}|\d{2}')

m_Obj = re.search(pattern, str1)

print('m_Obj.group():', m_Obj.group())

注意:re.match() 函数只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None;而 re.search() 函数匹配整个字符串,直到找到一个匹配。

5. 检索和替换

re 模块提供了 re.sub() 函数用于替换字符串中的匹配项。其语法格式如下:

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

该函数参数说明如下:

pattern:表示正则表达式中的模式字符串;

repl:表示替换的字符串,也可为一个函数;

string:表示要被查找/替换的原始字符串;

count:表示模式匹配后替换的最大次数,默认为 0,表示替换所有的匹配。

示例代码 example3.py 如下。

# -*- coding: utf-8 -*-

import re

str = "#This is String example##"

#删除字符串中的前后#号

sub_str = re.sub(r'^#*|#*$', '', str)

print(sub_str)

#将字符串中的空格替换成"-"

new_sub_str = re.sub(' ', '-', sub_str)

print(new_sub_str)

# 删除tel字符串中圆括号

tel = '(0731)22768450'

num = re.sub(r'\D', '', tel)

print('电话号码是:', num)

6. findall() 函数

findall() 函数可在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的子串,则返回空列表。其语法格式如下:

pattern.findall(string[, pos[, endpos]])

该函数参数说明如下:

pattern:表示匹配的正则表达式;

string:表示待匹配的字符串;

pos:可选参数,表示指定字符串的起始位置,默认为 0;

endpos:可选参数,表示指定字符串的结束位置,默认为字符串的长度;

注意:}match() 函数和 search() 函数只匹配一次,findall()函数匹配所有项。

示例代码 example4.py 如下。

# -*- coding: utf-8 -*-

import re

#查找字符串中的数字,返回列表

pattern = re.compile(r'\d+')

num1 = pattern.findall('www.163.com,www.51job.com')

print(num1)

num2 = pattern.findall('www.163.com,www.51job.com',0,7

print(num2)

7. re.finditer() 函数

finditer() 函数与 findall() 函数类似,可在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。其语法格式如下:

re.finditer(pattern, string, flags=0)

该函数参数说明如下:

pattern:表示匹配的正则表达式;

string:表示待匹配的字符串;

flags:标志位,用于控制正则表达式的匹配方式,例如,是否区分大小写、多行匹配等。具体见表 1。

示例代码 example5.py 如下。

# -*- coding: utf-8 -*-

import re

# 查找字符串中的数字,返回一个迭代器

num = re.finditer(r'\d+','abc32sa21hh56j10df')

for i in num:

print (i.group())

8. re.split() 函数

split() 函数按照能够匹配的子串将字符串分割后返回列表。其语法格式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

该函数参数说明如下:

pattern:表示匹配的正则表达式;

string:表示待匹配的字符串;

maxsplit:表示分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数;

flags:标志位,用于控制正则表达式的匹配方式,例如,是否区分大小写、多行匹配等。具体见表 1。

示例代码 example6.py 如下。

# -*- coding: utf-8 -*-

import re

#删除str字符串中的空格

str = "This is String example!"

str_list = str.split(' ')

new_str_list = ''.join(str_list

print(new_str_list)

#将str字符串按空格拆分成列表

str_list = re.split(' ', str)

print(str_list)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值