Python中的正则表达式

1. 正则表达式是什么?

正则表达式(Regular Expression),简称正则,是计算机科学中的一个概念。它是由一些字符和特殊符号组成的字符串,用于描述匹配某种模式的字符串。

在Python中,使用re模块来使用正则表达式。

1.1. 正则表达式基础

在正则表达式中,有一些

特殊字符(如^、$、*、+、?、.、|)

字符类(如[]、[^])

限定符(如{n}、{n,m}、*、+、?)

分组(用()来表示)

零宽度断言(如(?=pattern)、(?!pattern)、(?<=pattern)、(?

等概念。

以下是一些常用的正则表达式:

# 匹配字符串中的数字

import re

pattern = r'\d+'

str = 'hello, 123!'

match = re.findall(pattern, str)

print(match) # ['123']

解析:上面的正则表达式\d+,表示匹配1个或多个数字。findall()函数是re模块中的函数,用于查找字符串中所有符合正则表达式的子串。在上面的例子中,它返回了字符串'hello, 123!'中所有的数字。

# 匹配邮箱

import re

pattern = r'\w+@\w+\.[a-z]+'

str = 'my email is example@example.com'

match = re.findall(pattern, str)

print(match) # ['example@example.com']

解析:上面的正则表达式\w+@\w+\.[a-z]+,表示匹配邮箱地址。其中,\w+匹配1个或多个字母、数字或下划线;@\w+\.匹配字符@后面跟着1个或多个字母、数字或下划线,再接着一个.;[a-z]+匹配1个或多个小写字母。在上面的例子中,findall()函数查找到了匹配的邮箱地址。

1.2. 正则表达式修饰符

在Python中,可以为正则表达式添加修饰符,对正则表达式的匹配行为做出一些改动。

以下是Python正则表达式中常用的修饰符:

re.I:忽略大小写

re.M:多行匹配,^匹配行的开头,$匹配行的结尾

re.S:使.匹配包括换行在内的所有字符

re.U:使用Unicode字符集。影响\w、\W、\b、\B。

re.X:为正则表达式添加注释和空格

以下是Python正则表达式中带有修饰符的例子:

# 多行匹配

import re

pattern = r'^\d+$'

str = '123\n456\n789\n'

match = re.findall(pattern, str, re.M)

print(match) # ['123', '456', '789']

解析:上面的正则表达式^\d+$,表示匹配字符串中的一行,该行包含1个或多个数字。在上面的例子中,由于使用了re.M修饰符,所以它匹配了多行的数字。

2. re模块常用函数

Python的re模块提供了很多函数,用于对正则表达式模式进行操作。其中,最常用的函数是:

re.match():从字符串开头匹配一个模式

re.search():在字符串中匹配一个模式

re.findall():找到字符串中所有匹配的子串

re.sub():替换字符串中的匹配子串

2.1. re.match()

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

这个函数从字符串的开头尝试匹配一个模式。如果匹配到了,就返回一个匹配对象,否则返回None。

# 匹配字符串开头的数字

import re

pattern = r'\d+'

str = '123abc'

match = re.match(pattern, str)

if match:

print(match.group()) # 123

解析:在上面的例子中,使用re.match()函数来匹配字符串'123abc'。正则表达式\d+表示匹配1个或多个数字,所以它匹配到了字符串开头的数字123。使用group()方法来获取匹配的结果。

2.2. re.search()

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

这个函数在字符串中查找匹配的子串。如果找到了,就返回一个匹配对象,否则返回None。

# 匹配字符串中的数字

import re

pattern = r'\d+'

str = 'hello, 123!'

match = re.search(pattern, str)

if match:

print(match.group()) # 123

解析:在上面的例子中,使用re.search()函数来查找字符串'hello, 123!'中的数字。正则表达式\d+表示匹配1个或多个数字,所以它匹配到了数字123。使用group()方法来获取匹配的结果。

2.3. re.findall()

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

这个函数返回一个列表,其中包含了字符串中所有匹配的子串。

# 找到字符串中所有的单词

import re

pattern = r'\b\w+\b'

str = 'Hello world!'

match = re.findall(pattern, str)

print(match) # ['Hello', 'world']

解析:在上面的例子中,使用re.findall()函数来查找字符串'Hello world!'中所有的单词。正则表达式\b\w+\b表示匹配一个单词,其中\b表示单词的边界,\w+表示匹配一个或多个字母、数字或下划线。

2.4. re.sub()

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

这个函数用repl替换字符串中所有匹配的子串。count表示替换的最大次数,默认是0表示无限制。

# 替换字符串中的部分内容

import re

pattern = r'\d+'

str = 'hello, 123!'

result = re.sub(pattern, '456', str)

print(result) # hello, 456!

解析:在上面的例子中,使用re.sub()函数来替换字符串'hello, 123!'中的数字。正则表达式\d+表示匹配一个或多个数字,所以它匹配到了数字123。使用456来替换匹配到的内容。

3. 常见正则表达式模式

以下是一些常见的正则表达式模式:

匹配数字:\d

匹配非数字:\D

匹配字母、数字和下划线:\w

匹配非字母、数字和下划线:\W

匹配空白字符:\s

匹配非空白字符:\S

匹配任意字符(除了\n):.

匹配开头和结尾:^、$

匹配多个字符:\d+、\w+

匹配任意字符:.*、.+、?

匹配范围:[a-z]、[0-9]、[^A-Z](匹配不在A-Z范围内的字符)

3.1. 匹配电话号码

使用正则表达式来匹配电话号码,可以将电话号码中的数字、括号、短横线等分别进行匹配。

# 匹配电话号码

import re

pattern = r'(\d{3}[-\.\)]\d{4}[-\.\)]\d{4})|(\d{7})'

str = 'my phone number is 010-1234-5678'

match = re.findall(pattern, str)

print(match) # [('010-1234-5678', '')]

解析:在上面的例子中,使用正则表达式来匹配电话号码。其中,\d表示数字,\d{3}表示匹配3个数字,[-\.\)]表示匹配-、.或)中的任意一个字符,\d{4}表示匹配4个数字。使用|表示或的关系,用()来分组。在上面的例子中,返回了匹配的字符串。

3.2. 匹配邮箱地址

与电话号码类似,使用正则表达式来匹配邮箱地址,可以将邮箱地址中的用户名和域名分别进行匹配。

# 匹配邮箱地址

import re

pattern = r'\b\w+@\w+\.[a-z]+\b'

str = 'my email is example@example.com'

match = re.findall(pattern, str)

print(match) # ['example@example.com']

解析:在上面的例子中,使用正则表达式来匹配邮箱地址。其中,\w+匹配1个或多个字母、数字或下划线;@匹配字符@;\w+匹配1个或多个字母、数字或下划线;\.匹配字符.;[a-z]+匹配1个或多个小写字母。在上面的例子中,返回了匹配的字符串。

3.3. 匹配HTML标签

使用正则表达式来匹配HTML标签,可以将标签中的标签名、属性和文本内容分别进行匹配。

# 匹配HTML标签

import re

pattern = r'<\s*([a-z]+)(?:\s+\w+=(?:".*?"|\'.*?\'|[^\'"\s>]+)\s*)*>(.*?)<\s*/\s*\1\s*>'

str = '

hello world!'

match = re.findall(pattern, str)

if match:

print('tag: ', match[0][0])

print('attribute: ', match[0][1])

print('text: ', match[0][2])

解析:在上面的例子中,使用正则表达式来匹配HTML标签。其中,<表示匹配<字符,\s*表示匹配0个或多个空白字符,[a-z]+表示匹配1个或多个小写字母,(?:\s+\w+=(?:".*?"|\'.*?\'|[^\'"\s>]+)\s*)*表示匹配0个或多个标签属性,.*?表示匹配任意字符(非贪婪模式),\1表示引用前面的标签名。在上面的例子中,返回了匹配的标签名、属性和文本内容。

4. 总结

Python中的正则表达式提供了一种非常强大的字符串处理工具。通过正则表达式,可以方便地查找、替换和提取字符串中的信息。在实际应用中,可以按照具体的需求来自定义匹配规则,使得代码具有更高的灵活性和可扩展性。

后端开发标签