详细讲解 Python中的正则表达式

一、正则表达式概述

正则表达式(regular expression)是对字符串进行匹配的一种工具,Python 内置的 re 模块提供了正则表达式相关操作。正则表达式可以用来查找,替换和匹配文本。

在正则表达式中,可以使用多种元字符来匹配指定的字符、字符集合或者字符串。下面介绍一些常用的正则表达式元字符。

1. 字符匹配

字符匹配指的是匹配单个字符。下面列出常用的字符匹配元字符:

. 匹配除换行符外的任意字符。

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

\d 匹配数字。

\s 匹配任意空白字符。

\b 匹配单词边界。

\n 匹配换行符。

\t 匹配制表符。

[xyz] 匹配字符 x、y 或 z。

[^xyz] 匹配除字符 x、y、z 外的任意字符。

import re

pattern = r"\w\d\s."

text = "a1 b2 c_3 d汉 $%&"

print(re.findall(pattern, text))

# 输出:['a1 ', 'b2 ', 'c_3', ' d汉']

2. 重复匹配

重复匹配指的是匹配具有特定次数的字符或字符串。下面列出常用的重复匹配元字符:

* 匹配前面的字符或子表达式零次或多次。

+ 匹配前面的字符或子表达式一次或多次。

? 匹配前面的字符或子表达式零次或一次。

{n} 匹配前面的字符或子表达式恰好 n 次。

{n,} 匹配前面的字符或子表达式最少 n 次。

{n,m} 匹配前面的字符或子表达式最少 n 次,最多 m 次。

import re

pattern = r"\w{2,3}\d?"

text = "abc12 de_345 fghi_6 jklmn"

print(re.findall(pattern, text))

# 输出:['abc1', '2', 'de_3', '45', 'fgh', 'i_6', 'jkl', 'mn']

3. 分组匹配

分组匹配指的是将多个字符或字符串组合在一起进行匹配。下面列出常用的分组匹配元字符:

() 将括号内的字符或子表达式进行分组匹配。

| 匹配两个或多个分支模式中的任意一个。

(?P<name>) 给分组命名。

(?P=name) 引用以给定名称命名的组匹配的字符。

import re

pattern = r"(\w+)\s(\d+)"

text = "hello 123 world 456"

match = re.search(pattern, text)

if match:

print(match.group(1)) # 输出:hello

print(match.group(2)) # 输出:123

4. 其他元字符

除了以上的元字符外,还有一些其他的元字符:

^ 匹配字符串的开头位置。

$ 匹配字符串的结尾位置。

\ 转义字符。

import re

pattern = r"\bhello\b"

text = "hello world"

match = re.search(pattern, text)

if match:

print("匹配成功")

else:

print("匹配失败")

二、re 模块中的常用函数

Python 内置的 re 模块提供了多种用于正则表达式操作的函数。

1. re.search()

re.search() 函数用于在字符串内查找模式匹配的第一个位置,并返回一个包含匹配信息的 match 对象。如果字符串中没有与模式匹配的位置,返回 None。

import re

pattern = r"\d+"

text = "hello 123 world 456"

match = re.search(pattern, text)

if match:

print(match.group()) # 输出:123

2. re.match()

re.match() 函数用于检测字符串的开头是否匹配正则表达式,并返回一个包含匹配信息的 match 对象。如果字符串开头的位置没有匹配,返回 None。

import re

pattern = r"hello"

text = "hello world"

match = re.match(pattern, text)

if match:

print(match.group()) # 输出:hello

3. re.findall()

re.findall() 函数用于在字符串内查找所有匹配正则表达式的字符串,并返回包含这些字符串的列表。如果没有匹配的字符串,返回空列表。

import re

pattern = r"\d+"

text = "hello 123 world 456"

print(re.findall(pattern, text)) # 输出:['123', '456']

4. re.split()

re.split() 函数用于在字符串内将正则表达式匹配到的子串分隔成一个列表,并返回这个列表。分隔时,在两个匹配项之间的字符串都会作为列表的一个元素来处理。

import re

pattern = r"\s+"

text = "hello world"

print(re.split(pattern, text)) # 输出:['hello', 'world']

5. re.sub()

re.sub() 函数用于在字符串中替换所有匹配正则表达式的字符串,并返回替换后的字符串。

import re

pattern = r"\d+"

text = "hello 123 world 456"

print(re.sub(pattern, "666", text)) # 输出:hello 666 world 666

三、正则表达式实战

下面通过一个例子来演示如何使用正则表达式来匹配网页中的图片地址。

import requests

import re

url = "https://unsplash.com/"

response = requests.get(url)

pattern = r'srcset="(.+?)[?|"]'

results = re.findall(pattern, response.text)

for result in results:

print(result)

以上代码可以匹配 Unsplash 网站首页中所有图片地址,运行结果如下:

https://images.unsplash.com/photo-1635977512298-9b4d6f7ad8f6?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635860124986-66ded124b0e0?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1636000896345-6479c1c9fd59?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635988259782-0526bb89d9fd?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635978385339-1b741e4e931f?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635974387757-5b05d889a188?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635991208506-12374331b8da?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1636016665706-35ba1feaff11?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635989067509-08b92690a05f?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635974895840-a8792450a7cf?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1636012621901-ef6d8d754d0b?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1636025540507-4ef57d44edf6?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1636000583321-4c44c3b2e5e3?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1636024919676-2ef252091952?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1636015664013-55c3c407c01e?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635955813387-2b1f60d88d11?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635891010054-3e6a8f99682e?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1636036977940-5474f701c7c6?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635796723868-451723d71579?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635882931507-5e94812fb875?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635878324924-f52e8dd19600?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635959479965-d49dbb3eb155?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635862559359-68d6136ac77e?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635875995511-e6143071b97f?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635990670196-5e355d3df511?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635876798782-12b2102bfe3f?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1636031118133-a585d0b10c3a?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2.1&q=80&w=32

https://images.unsplash.com/photo-1635877686111-632186e75a83?crop=entropy&cs=tinysrgb&fit=crop&fm=jpg&h=32&ixlib=rb-1.2