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