> 文章列表 > Python正则表达式

Python正则表达式

Python正则表达式

正则表达式(Regular Expression)是用于描述字符模式的一种语法。Python中内置了re模块,可以用来使用正则表达式进行字符串匹配和查找。


正则表达式可以用来匹配、查找和替换文本中的字符模式,这些模式是由一些字符和特殊符号组成的。比如说,一个正则表达式可以用来匹配一个邮箱地址,另一个可以用来匹配一个电话号码。

以下是一些常用的正则表达式语法和符号:

  1. 字符匹配
  • 匹配单个字符:使用该字符本身即可,例如匹配字符a,使用正则表达式 a。
  • 匹配多个字符:使用方括号[],例如匹配a、b、c其中之一,使用正则表达式 [abc]。
  • 匹配字符范围:使用连字符-,例如匹配a到z之间的任意一个字符,使用正则表达式 [a-z]。
  • 匹配反义字符:使用脱字符^,例如匹配不是a的任意字符,使用正则表达式 [^a]。
  1. 量词符号
  • 匹配单个字符:使用量词符号,例如匹配a出现一次,使用正则表达式 a。
  • 匹配多个字符:使用量词符号,例如匹配a出现3次,使用正则表达式 a{3}。
  • 匹配多个字符的范围:使用量词符号,例如匹配a出现2~5次,使用正则表达式 a{2,5}。
  • 匹配任意字符:使用通配符.,例如匹配任意字符,使用正则表达式 …。
  1. 特殊字符
  • 转义字符:使用反斜杠\\,例如匹配字符.,使用正则表达式 .。
  • 重复出现的字符:使用重复字符,例如匹配出现1~3次的字符a,使用正则表达式 a?。
  • 捕获组:使用括号(),例如匹配以apple开头并以orange结尾的字符串,使用正则表达式 ^(apple).*(orange)$。

以下是一个简单的示例,该正则表达式用于匹配邮箱地址:

import re# 定义匹配电子邮件地址的正则表达式模式
email_pattern = r'\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b'# 要搜索的文本
text = 'Please contact us at contact@example.com for assistance'# 在文本中搜索电子邮件地址
match = re.search(email_pattern, text)# 如果找到了电子邮件地址,则输出
if match:print('Email address found:', match.group())
else:print('Email address not found')

该正则表达式使用了常见的字符匹配和量词符号,用于匹配一个有效的邮箱地址。如果在文本中找到了匹配的字符串,将会输出匹配的邮箱地址。

使用正则表达式匹配字符串中的电话号码:

import retext = "请拨打电话号码:010-12345678"# 定义正则表达式
pattern = r'\\d{3}-\\d{8}'# 搜索字符串中符合模式的内容
match = re.search(pattern, text)if match:print("找到电话号码:", match.group())
else:print("未找到电话号码")

上述代码中,首先导入了re模块,然后定义了一个字符串text和一个正则表达式pattern。在使用re.search函数搜索字符串中是否有符合模式的内容时,找到符合的第一个结果后就会停止搜索。如果搜索到了匹配的结果,则通过match.group()方法获取匹配的字符串。如果未找到符合模式的内容,则输出未找到电话号码。

这只是正则表达式的一个简单应用例子,正则表达式非常强大,可以用来处理各种字符串匹配问题,如提取网页中的链接、抽取文本中的邮箱地址等等,之后的爬虫也会用得到(爬取一些音乐、视频等素材)。


当使用正则表达式处理文本时,通常需要使用一些特殊字符来描述匹配模式。下面是一些常用的正则表达式元字符:

表达式 描述
. 匹配任意单个字符
[] 字符集,匹配其中任意一个字符。例如,[abc]匹配a、b或c
[^] 否定字符集,匹配不在其中的任意一个字符。例如,[^abc]匹配除了a、b或c之外的任意字符
- 范围,匹配指定范围内的任意一个字符。例如,[a-z]匹配小写字母a到z中的任意一个字符
\\d 匹配任意一个数字,等同于[0-9]
\\D 匹配任意一个非数字字符,等同于[^0-9]
\\w 匹配任意一个字母、数字或下划线,等同于[a-zA-Z0-9_]
\\W 匹配任意一个非字母、数字或下划线字符,等同于[^a-zA-Z0-9_]
\\s 匹配任意一个空白字符,包括空格、制表符和换行符。
\\S 匹配任意一个非空白字符。

除了元字符外,正则表达式还支持一些其他的特殊字符,如:

表达式 描述
* 匹配前面的表达式零次或多次。
+ 匹配前面的表达式一次或多次。
? 匹配前面的表达式零次或一次。
{n} 匹配前面的表达式恰好n次。
{n,} 匹配前面的表达式至少n次。
{n,m} 匹配前面的表达式至少n次,最多m次。
^ 匹配字符串的开头
$ 匹配字符串的结尾
|
() 括号内的表达式是一个分组,可以在后续中被引用
[] 方括号内表示一个字符集合,可以匹配其中任意一个字符
  • 匹配一个以字母开头,后面跟着任意个数字和字母的字符串:^[a-zA-Z]\\w*$
  • 匹配一个四位数字的邮政编码:\\d{4}
  • 匹配一个标准的邮箱地址:^\\w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$
  • 匹配一个中国大陆的手机号码:^1[3-9]\\d{9}$
  • 匹配一个HTTP或HTTPS的URL:^https?😕/\\w+.\\w+$
  • 需要注意的是,正则表达式中有一些特殊字符和语法,需要转义才能正常匹配。在Python中可以使用 re.escape() 函数来进行转义。

下面是一个简单的正则表达式匹配示例,它可以匹配以字母a开头,后面跟着任意多个字母、数字或下划线的字符串:

import re# 定义正则表达式的模式
pattern = r'^a\\w*'# 定义三个字符串变量,用于测试正则表达式的匹配
text1 = 'apple'
text2 = 'a1_2_b'
text3 = '123abc'# 使用 re.match 函数进行匹配
match1 = re.match(pattern, text1)
match2 = re.match(pattern, text2)
match3 = re.match(pattern, text3)# 打印匹配结果
print(match1)  
print(match2)  
print(match3)  

首先,我们定义了一个正则表达式的模式,使用原始字符串来避免 Python 对特殊字符的转义影响。模式中的 “^” 表示匹配字符串的开头, “a” 表示匹配以字母 a 开头的字符串, “\\w*” 表示匹配后面的任意单词字符(包括字母、数字、下划线),“*” 表示匹配零次或多次。

接着,我们定义了三个字符串变量 text1、text2 和 text3,用于测试正则表达式的匹配。text1 和 text2 都符合模式,text3 不符合。

使用 re.match 函数进行匹配,如果成功匹配,则返回一个 Match 对象,否则返回 None。我们分别对 text1、text2 和 text3 进行了匹配,并将结果保存在 match1、match2 和 match3 变量中。

最后,我们打印了每个 Match 对象的内容。可以看到,match1 和 match2 都匹配成功,并返回了对应的 Match 对象,而 match3 匹配失败,返回了 None。

输出结果是:<re.Match object; span=(0, 5), match='apple'>
<re.Match object; span=(0, 5), match='a1_2_'>
None

假设我们有一段文本,我们想要从中提取出所有的日期信息。这里我们可以使用正则表达式来匹配日期格式,例如"YYYY-MM-DD"的格式。

代码:

import retext = "Today is 2023-04-20, yesterday was 2023-04-19, and tomorrow will be 2023-04-21."date_pattern = r'\\d{4}-\\d{2}-\\d{2}'  # 匹配日期格式matches = re.findall(date_pattern, text)  # 寻找所有匹配项print("Dates found:")
for match in matches:print(match)
  1. 导入re模块;
  2. 定义一个字符串text,包含多个日期信息;
  3. 定义正则表达式模式date_pattern,它匹配了符合格式"YYYY-MM-DD"的日期;
  4. 使用re模块的findall函数寻找text中所有匹配date_pattern的子串;
  5. 打印所有匹配项。
    输出结果:
Dates found:
2023-04-20
2023-04-19
2023-04-21

这样,我们就成功地从文本中提取出了所有日期信息。


学习Python正则表达式可以帮助我们处理和匹配文本数据。在实际应用中,经常需要从文本中提取出有用的信息,或者根据特定的规则来检查文本是否符合要求。正则表达式可以帮助实现这些操作,从而提高数据处理的效率。

当然,Python中的正则表达式不仅仅可以用于文本处理,也可以用于网络爬虫。爬虫程序需要从网页中提取出有用的信息,例如链接、标题、图片等等。使用正则表达式可以帮助我们快速准确地定位所需信息的位置,并提取出来。

需要注意的是,正则表达式并不是解析HTML和XML文档的最佳工具。针对HTML和XML文档的解析应该使用专门的解析器库,例如BeautifulSoup和lxml等。但在一些简单的场景下,正则表达式也可以用于处理HTML和XML文本。