1. 正则表达式是什么?
正则表达式(Regular Expression),简称正则,是计算机科学中的一个概念。它是由一些字符和特殊符号组成的字符串,用于描述匹配某种模式的字符串。
在Python中,使用re模块来使用正则表达式。
1.1. 正则表达式基础
在正则表达式中,有一些
特殊字符(如^、$、*、+、?、.、|)
字符类(如[]、[^])
限定符(如{n}、{n,m}、*、+、?)
分组(用()来表示)
零宽度断言(如(?=pattern)、(?!pattern)、(?<=pattern)、(?
等概念。
以下是一些常用的正则表达式:
# 匹配字符串中的数字
import re
pattern = r'\d+'
str = 'hello, 123!'
match = re.findall(pattern, str)
print(match) # ['123']
解析:上面的正则表达式\d+,表示匹配1个或多个数字。findall()函数是re模块中的函数,用于查找字符串中所有符合正则表达式的子串。在上面的例子中,它返回了字符串'hello, 123!'中所有的数字。
# 匹配邮箱
import re
pattern = r'\w+@\w+\.[a-z]+'
str = 'my email is example@example.com'
match = re.findall(pattern, str)
print(match) # ['example@example.com']
解析:上面的正则表达式\w+@\w+\.[a-z]+,表示匹配邮箱地址。其中,\w+匹配1个或多个字母、数字或下划线;@\w+\.匹配字符@后面跟着1个或多个字母、数字或下划线,再接着一个.;[a-z]+匹配1个或多个小写字母。在上面的例子中,findall()函数查找到了匹配的邮箱地址。
1.2. 正则表达式修饰符
在Python中,可以为正则表达式添加修饰符,对正则表达式的匹配行为做出一些改动。
以下是Python正则表达式中常用的修饰符:
re.I:忽略大小写
re.M:多行匹配,^匹配行的开头,$匹配行的结尾
re.S:使.匹配包括换行在内的所有字符
re.U:使用Unicode字符集。影响\w、\W、\b、\B。
re.X:为正则表达式添加注释和空格
以下是Python正则表达式中带有修饰符的例子:
# 多行匹配
import re
pattern = r'^\d+$'
str = '123\n456\n789\n'
match = re.findall(pattern, str, re.M)
print(match) # ['123', '456', '789']
解析:上面的正则表达式^\d+$,表示匹配字符串中的一行,该行包含1个或多个数字。在上面的例子中,由于使用了re.M修饰符,所以它匹配了多行的数字。
2. re模块常用函数
Python的re模块提供了很多函数,用于对正则表达式模式进行操作。其中,最常用的函数是:
re.match():从字符串开头匹配一个模式
re.search():在字符串中匹配一个模式
re.findall():找到字符串中所有匹配的子串
re.sub():替换字符串中的匹配子串
2.1. re.match()
re.match(pattern, string, flags=0)
这个函数从字符串的开头尝试匹配一个模式。如果匹配到了,就返回一个匹配对象,否则返回None。
# 匹配字符串开头的数字
import re
pattern = r'\d+'
str = '123abc'
match = re.match(pattern, str)
if match:
print(match.group()) # 123
解析:在上面的例子中,使用re.match()函数来匹配字符串'123abc'。正则表达式\d+表示匹配1个或多个数字,所以它匹配到了字符串开头的数字123。使用group()方法来获取匹配的结果。
2.2. re.search()
re.search(pattern, string, flags=0)
这个函数在字符串中查找匹配的子串。如果找到了,就返回一个匹配对象,否则返回None。
# 匹配字符串中的数字
import re
pattern = r'\d+'
str = 'hello, 123!'
match = re.search(pattern, str)
if match:
print(match.group()) # 123
解析:在上面的例子中,使用re.search()函数来查找字符串'hello, 123!'中的数字。正则表达式\d+表示匹配1个或多个数字,所以它匹配到了数字123。使用group()方法来获取匹配的结果。
2.3. re.findall()
re.findall(pattern, string, flags=0)
这个函数返回一个列表,其中包含了字符串中所有匹配的子串。
# 找到字符串中所有的单词
import re
pattern = r'\b\w+\b'
str = 'Hello world!'
match = re.findall(pattern, str)
print(match) # ['Hello', 'world']
解析:在上面的例子中,使用re.findall()函数来查找字符串'Hello world!'中所有的单词。正则表达式\b\w+\b表示匹配一个单词,其中\b表示单词的边界,\w+表示匹配一个或多个字母、数字或下划线。
2.4. re.sub()
re.sub(pattern, repl, string, count=0, flags=0)
这个函数用repl替换字符串中所有匹配的子串。count表示替换的最大次数,默认是0表示无限制。
# 替换字符串中的部分内容
import re
pattern = r'\d+'
str = 'hello, 123!'
result = re.sub(pattern, '456', str)
print(result) # hello, 456!
解析:在上面的例子中,使用re.sub()函数来替换字符串'hello, 123!'中的数字。正则表达式\d+表示匹配一个或多个数字,所以它匹配到了数字123。使用456来替换匹配到的内容。
3. 常见正则表达式模式
以下是一些常见的正则表达式模式:
匹配数字:\d
匹配非数字:\D
匹配字母、数字和下划线:\w
匹配非字母、数字和下划线:\W
匹配空白字符:\s
匹配非空白字符:\S
匹配任意字符(除了\n):.
匹配开头和结尾:^、$
匹配多个字符:\d+、\w+
匹配任意字符:.*、.+、?
匹配范围:[a-z]、[0-9]、[^A-Z](匹配不在A-Z范围内的字符)
3.1. 匹配电话号码
使用正则表达式来匹配电话号码,可以将电话号码中的数字、括号、短横线等分别进行匹配。
# 匹配电话号码
import re
pattern = r'(\d{3}[-\.\)]\d{4}[-\.\)]\d{4})|(\d{7})'
str = 'my phone number is 010-1234-5678'
match = re.findall(pattern, str)
print(match) # [('010-1234-5678', '')]
解析:在上面的例子中,使用正则表达式来匹配电话号码。其中,\d表示数字,\d{3}表示匹配3个数字,[-\.\)]表示匹配-、.或)中的任意一个字符,\d{4}表示匹配4个数字。使用|表示或的关系,用()来分组。在上面的例子中,返回了匹配的字符串。
3.2. 匹配邮箱地址
与电话号码类似,使用正则表达式来匹配邮箱地址,可以将邮箱地址中的用户名和域名分别进行匹配。
# 匹配邮箱地址
import re
pattern = r'\b\w+@\w+\.[a-z]+\b'
str = 'my email is example@example.com'
match = re.findall(pattern, str)
print(match) # ['example@example.com']
解析:在上面的例子中,使用正则表达式来匹配邮箱地址。其中,\w+匹配1个或多个字母、数字或下划线;@匹配字符@;\w+匹配1个或多个字母、数字或下划线;\.匹配字符.;[a-z]+匹配1个或多个小写字母。在上面的例子中,返回了匹配的字符串。
3.3. 匹配HTML标签
使用正则表达式来匹配HTML标签,可以将标签中的标签名、属性和文本内容分别进行匹配。
# 匹配HTML标签
import re
pattern = r'<\s*([a-z]+)(?:\s+\w+=(?:".*?"|\'.*?\'|[^\'"\s>]+)\s*)*>(.*?)<\s*/\s*\1\s*>'
str = '
hello world!'
match = re.findall(pattern, str)
if match:
print('tag: ', match[0][0])
print('attribute: ', match[0][1])
print('text: ', match[0][2])
解析:在上面的例子中,使用正则表达式来匹配HTML标签。其中,<表示匹配<字符,\s*表示匹配0个或多个空白字符,[a-z]+表示匹配1个或多个小写字母,(?:\s+\w+=(?:".*?"|\'.*?\'|[^\'"\s>]+)\s*)*表示匹配0个或多个标签属性,.*?表示匹配任意字符(非贪婪模式),\1表示引用前面的标签名。在上面的例子中,返回了匹配的标签名、属性和文本内容。
4. 总结
Python中的正则表达式提供了一种非常强大的字符串处理工具。通过正则表达式,可以方便地查找、替换和提取字符串中的信息。在实际应用中,可以按照具体的需求来自定义匹配规则,使得代码具有更高的灵活性和可扩展性。