Python基础 9.正则

1. 正则表达式简介

正则表达式(Regular Expression,简称 regex 或 regexp)是一种用来描述、匹配一系列字符串的文本模式。每个字符都有特定的含义或用途,可以用来匹配特定的字符、字符组合、单词或文本。Python中使用re模块进行正则表达式的操作。

1.1 正则表达式的语法

正则表达式的语法由一系列特殊的字符和普通字符组成,其中特殊字符被称为元字符。下面是一些常见的元字符:

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

^ 匹配字符串的开头。

$ 匹配字符串的结尾。

* 匹配前面的字符0或多次。

+ 匹配前面的字符1或多次。

? 匹配前面的字符0或1次。

{n} 匹配前面的字符恰好n次。

{n,} 匹配前面的字符至少n次。

{n,m} 匹配前面的字符至少n次,但不超过m次。

| 或的意思,可以匹配多个表达式中的任意一个。

[] 表示一个字符集合,可以匹配其中的任意一个字符。

[^] 表示一个否定字符集,可以匹配除其中的任意一个字符以外的所有字符。

1.2 正则表达式的使用

要在Python中使用正则表达式,首先需要导入re模块。接下来,可以使用re模块中的函数来进行各种操作,如匹配、查找、替换等。

下面是一些常用的re函数:

re.match 从字符串的开头开始匹配正则表达式。

re.search 在字符串中搜索匹配正则表达式的第一个位置。

re.findall 找到字符串中所有匹配正则表达式的子串,并返回一个列表。

re.sub 找到所有匹配正则表达式的子串,并将其用指定的字符串代替。

re.split 使用正则表达式分割字符串,返回一个列表。

下面以一些常见的例子介绍正则表达式的使用。

2. 常见正则表达式示例

2.1 匹配邮箱地址

邮箱地址一般有以下格式:username@domain.com。下面的代码可以用来匹配邮箱地址:

import re

email_pattern = r'^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$'

def is_valid_email(email):

if re.match(email_pattern, email):

return True

else:

return False

emails = ['abc@gmail.com', 'myemail@yahoo.com', 'jane.doe@example.co.uk', 'not_an_email']

for email in emails:

if is_valid_email(email):

print(f'{email} is a valid email.')

else:

print(f'{email} is not a valid email.')

以上代码中使用了re.match函数来判断字符串是否符合邮箱地址的格式,r'^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$'是邮箱地址的正则表达式,其中^表示字符串的开头,$表示字符串的结尾,\w+表示至少一个字母或数字,@匹配'@'字符,[a-zA-Z_]+?匹配至少一个英文字母或下划线,\.匹配'.'字符,[a-zA-Z]{2,3}匹配两到三个英文字母。

运行以上代码,可以得到输出结果:

abc@gmail.com is a valid email.

myemail@yahoo.com is a valid email.

jane.doe@example.co.uk is a valid email.

not_an_email is not a valid email.

2.2 匹配手机号码

中国大陆地区的手机号码一般有以下格式:11位数字,以1开头,第二位可能是3、4、5、7、8中的一个。下面是一个匹配手机号码的正则表达式:

import re

phone_pattern = r'^1[34578]\d{9}$'

def is_valid_phone(phone):

if re.match(phone_pattern, phone):

return True

else:

return False

phones = ['13912345678', '18888888888', '110', 'not_a_phone']

for phone in phones:

if is_valid_phone(phone):

print(f'{phone} is a valid phone number.')

else:

print(f'{phone} is not a valid phone number.')

以上代码中的正则表达式^1[34578]\d{9}$表示匹配以1开头的11位数字,其中[34578]表示第二位数字可以是3、4、5、7、8中的一个,\d{9}表示后面9位数字。

运行以上代码,可以得到输出结果:

13912345678 is a valid phone number.

18888888888 is a valid phone number.

110 is not a valid phone number.

not_a_phone is not a valid phone number.

2.3 提取HTML中的链接

下面的代码可以从一个HTML文件中提取所有的链接:

import re

html = '''

Python基础教程

欢迎学习Python

Python是一门优雅而强大的编程语言。

详细了解Python,欢迎访问https://python.org

'''

links = re.findall(r'href="(.*?)"', html)

for link in links:

print(link)

以上代码中使用了re.findall函数来找到所有匹配正则表达式href="(.*?)"的子串,其中(.*?)表示一个非贪婪匹配,也就是尽可能少地匹配字符,href="表示匹配'href="'字符,"表示匹配'"'字符,两者之间的(.*?)表示匹配任意字符,直到遇到下一个'"'字符。

运行以上代码,可以得到输出结果:

https://python.org

至此,我们已经介绍了正则表达式的语法和使用,并给出了一些常见的正则表达式示例。在实际使用中,正则表达式非常有用,可以帮助我们快速地从大量的文本数据中提取出我们需要的信息。

后端开发标签