Python正则表达式详解
随着信息化时代的发展,越来越多的信息从各个领域涌现出来,其中大量的信息需要通过程序进行处理。而很多情况下我们需要从这些信息中提取出我们需要的部分,这就需要使用到正则表达式。正则表达式是一种能够匹配文本片段的方法,它的出现极大地方便了我们信息处理的工作。本文将详细介绍Python中的正则表达式。
正则表达式的基本语法
正则表达式是一种特殊的字符序列,它可以用来描述一类字符串的集合。正则表达式是由普通字符(例如字符a到z)以及特殊字符(称为元字符)构成的文字模式。下面是一些基本的正则表达式元字符:
- .:匹配任意单个字符,除了换行符。
- []:匹配一个字符集合,集合中的字符可以被匹配。例如,[abc]可以匹配字符a、b和c。也可以使用[0-9]匹配任意数字。
- ^:匹配字符串的开始。
- $:匹配字符串的结束。
下面是一些量词元字符:
- :匹配前一个字符0次或多次。
- +:匹配前一个字符1次或多次。
- ?:匹配前一个字符0次或1次。
- {m}:匹配前一个字符m次。
- {m,}:匹配前一个字符至少m次。
- {m,n}:匹配前一个字符至少m次,但不超过n次。
除了上面的元字符之外,还有一些特殊的元字符,例如:
- \d:匹配任意数字。
- \s:匹配任意空格字符。
- \w:匹配任意字母数字字符。
- \b:匹配单词边界。
下面是一些常见的正则表达式示例:
- 匹配一个手机号:^1[3-9]\d{9}$
- 匹配一个座机号:^0\d{2,3}-\d{7,8}$
- 匹配一个电子邮件地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
Python中的正则表达式模块
Python中内置了re模块,该模块提供了一系列正则表达式操作函数。下面是一些常用的re模块函数:
- compile(pattern, flags=0):编译正则表达式并返回正则表达式对象。
- search(pattern, string, flags=0):在字符串中搜索匹配正则表达式的第一个位置,返回匹配对象。
- match(pattern, string, flags=0):从字符串开始处匹配正则表达式,返回匹配对象。
- findall(pattern, string, flags=0):返回字符串中所有匹配正则表达式的子串组成的列表。
- sub(pattern, repl, string, count=0, flags=0):将字符串中所有匹配正则表达式的子串替换为指定的字符串。
- split(pattern, string, maxsplit=0, flags=0):用正则表达式指定的模式分隔字符串,返回列表。
下面是一些正则表达式操作的示例:
import re
# 匹配一个手机号
phone_pattern = re.compile(r'^1[3-9]\\d{9}$')
phone_number = '13812345678'
if phone_pattern.match(phone_number):
print('It is a valid phone number.')
else:
print('It is not a valid phone number.')
# 匹配一个电子邮件地址
email_pattern = re.compile(r'^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$')
email_address = 'test@example.com'
if email_pattern.match(email_address):
print('It is a valid email address.')
else:
print('It is not a valid email address.')
# 替换一个字符串中的所有数字
number_pattern = re.compile(r'\\d+')
string = 'abc123def456'
new_string = number_pattern.sub('', string)
print(new_string)
输出结果为:
It is a valid phone number.
It is a valid email address.
abcdef
正则表达式的高级应用
正则表达式除了可以进行基本的匹配之外,还可以进行更加复杂的操作。下面是一些正则表达式的高级应用:
- 分组:可以使用小括号()来将一部分正则表达式分组,以便对该部分进行操作。例如,可以使用(A|B)来匹配A或者B。
- 零宽断言:可以使用零宽断言来匹配某个位置,而不是匹配一个字符。例如,可以使用(?<=…)来匹配某个位置之前的内容,或者使用(?=…)来匹配某个位置之后的内容。
- 贪婪与非贪婪:默认情况下,正则表达式是贪婪的,也就是说,它会尽可能多地匹配字符。如果想匹配尽可能少的字符,可以在量词元字符后面加上?。例如,.会匹配尽可能多的字符,而.?会匹配尽可能少的字符。
下面是一些正则表达式的高级应用示例:
import re
# 分组
pattern = re.compile(r'(\\b\\w+\\b) \\1') # 匹配重复的单词
string = 'hello hello world'
found = pattern.search(string)
if found:
print(found.group())
# 零宽断言
pattern = re.compile(r'(?<=<a href=")[^"]+(?=">)') # 匹配a标签中的链接
string = '<a href="<http://example.com>">example</a>'
found = pattern.search(string)
if found:
练习题
练习1:验证输入用户名和QQ号是否有效并给出对应的提示信息。
练习2:从一段文字中提取出国内手机号码。
练习3:替换字符串中的不良内容。
练习4:拆分长字符串。