Python re模块 正则表达式

1. Python re模块

Python中re模块是一个很重要的模块,也是应用最广泛的模块之一。在Python中,正则表达式的处理是通过re模块来进行的。正则表达式是一种用来匹配字符串的方法,使用正则表达式可以实现字符串的高级匹配和替换。

1.1 re模块常用函数

在re模块中,常用的函数有:

re.search():在字符串中搜索匹配项。

re.findall():返回字符串中所有与模式匹配的字符串。

re.sub():用替换字符串替换与模式匹配的字符串。

re.split():将字符串按照匹配项进行分割。

re.compile():将正则表达式编译为一个对象,提高效率。

1.2 正则表达式语法

正则表达式是一种字符串的表示方法,用于描述一个字符串满足某种规则的模式。在 Python 的 re 模块中,正则表达式的语法可以分为以下几类:

普通字符:包括大小写字母和数字,可以直接匹配特定的字符。

元字符:包括 . ^ $ * + ? {} [] \ | () 等,是在普通字符的基础上进行一定的扩展。

字符集:使用 [] 表示,表示匹配方括号中任意一个字符。

量词:用来表示一个字符或一组字符重复出现的次数。

分组:用 () 表示,可以将一组字符看做一个整体,同时可以对分组进行操作。

转义字符:使用 \ 表示,用来表示特殊字符的字面意义。

下面将对以上各类语法进行详细介绍。

1.3 普通字符

普通字符是正则表达式中最基本的语法单元,可以直接匹配特定的字符。例如,正则表达式 hello 可以匹配字符串中的 hello。

在正则表达式中,所有的字母、数字、符号都是普通字符,它们匹配的是它们自身的字面意义。注意大小写的区别。例如,正则表达式 Hello 与字符串 hello 是不匹配的。

1.4 元字符

元字符是在普通字符的基础上进行一定的扩展,可以用来表示一些特殊的含义。

.: 表示匹配除了换行符以外的任意一个字符。

^: 表示匹配字符串的开头。

$: 表示匹配字符串的结尾。

*: 表示匹配出现 0 次或多次的字符。

+: 表示匹配出现 1 次或多次的字符。

?: 表示匹配出现 0 次或 1 次的字符。

{m}: 表示匹配出现 m 次的字符。

{m,n}: 表示匹配出现 m 到 n 次的字符。

[]: 表示匹配方括号中的一个字符。

\: 用来表示某些特殊的字符。

1.5 字符集

字符集使用 [] 表示,表示匹配方括号中任意一个字符。例如,[abc] 表示匹配字符串中任意一个字符为 a、b 或 c。

字符集中可以使用连字符 - 来表示连续的字符,例如 [a-z] 表示匹配字符串中任意一个小写字母。如果想要匹配连字符本身,可以使用反斜杠将其转义。

字符集中还可以使用 ^ 表示匹配除了方括号中的字符以外的所有字符。

1.6 量词

量词表示一个字符或一组字符重复出现的次数。

*: 匹配出现 0 次或多次的字符。

+: 匹配出现 1 次或多次的字符。

?: 匹配出现 0 次或 1 次的字符。

{m}: 匹配出现 m 次的字符。

{m,n}: 匹配出现 m 到 n 次的字符。

量词默认是贪婪的,即尽可能多的匹配字符。例如,正则表达式 a.*b 可以匹配的字符串为 aabcdb,因为它将 a 和 b 之间的任意字符都匹配了。如果希望量词变为非贪婪的,可以在量词后面加上 ? 号。

1.7 分组

分组用 () 表示,可以将一组字符看做一个整体,同时可以对分组进行操作。例如,正则表达式 (\d{3})-(\d{3})-(\d{4}) 可以匹配电话号码形式的字符串。

分组可以嵌套,例如,正则表达式 (a(b(c))) 中,第一层分组是整个正则表达式,第二层分组是 (b(c)),第三层分组是 (c)。

1.8 转义字符

有些特殊字符在正则表达式中有特殊的含义,如果希望这些字符被当做字面意义来匹配,可以使用 \ 进行转义。

例如,正则表达式 \. 可以匹配字符串中的 . 符号。

2. re模块应用场景

re模块广泛应用于文本处理和正则表达式模式匹配,它可以帮助我们快速地完成很多复杂的文本处理任务。

2.1 匹配邮箱地址

匹配邮箱地址是正则表达式的一个常见应用场景。下面是一个匹配邮箱地址的正则表达式:

import re

pattern = r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$'

email = 'name@example.com'

result = re.match(pattern, email)

if result:

print(result.group())

else:

print('Not a valid email address.')

在上面的代码中,我们使用 ^ 表示匹配字符串的开头,使用 $ 表示匹配字符串的结尾,通过组合使用,可以保证正则表达式匹配整个字符串。

正则表达式中的 [a-zA-Z0-9_-]+ 表示匹配一个或多个大小写字母、数字、下划线或减号,表示邮箱用户名部分。@[a-zA-Z0-9_-]+ 表示匹配 @ 符号和一个或多个大小写字母、数字、下划线或减号,表示邮箱域名中的服务器部分。(\.[a-zA-Z0-9_-]+)+ 表示匹配一个或多个小数点和一个或多个大小写字母、数字、下划线或减号,表示邮箱域名中的后缀部分。

2.2 替换字符串

re模块提供了re.sub()函数,可以用来替换字符串中与正则表达式模式匹配的文本。下面是一个使用re.sub()函数进行字符串替换的示例:

import re

pattern = r'dog'

replace = 'cat'

sentence = 'I love my dog and my cat.'

result = re.sub(pattern, replace, sentence)

print(result)

在上面的代码中,我们使用 r'dog' 表示我们希望匹配的字符串是 dog,使用 'cat' 表示我们要用cat字符串来替换所有与模式匹配的字符串。

2.3 分割字符串

re模块提供了re.split()函数,可以通过正则表达式对字符串进行分割,得到一个分割后的列表。下面是一个对字符串进行分割的示例:

import re

pattern = r'\s+'

sentence = 'I love Python.'

result = re.split(pattern, sentence)

print(result)

在上面的代码中,我们使用 r'\s+' 表示匹配一个或多个空白字符,包括空格、制表符、换行符等。通过使用re.split()函数,我们可以将字符串分割成几段,得到一个分割后的列表。

3. 总结

re模块是Python中用于正则表达式处理的模块,可以用于字符串匹配、字符串替换、字符串分割等各种操作。在正则表达式语法中,普通字符、元字符、字符集、量词、分组、转义字符都是需要掌握的基本内容。掌握正则表达式可以使我们在文本处理和数据清洗方面更加得心应手。

后端开发标签