一、Python正则表达式
正则表达式(Regular Expression,简称regex或regexp)是一种强大的文本处理工具,它允许你使用特定的模式来搜索、匹配、替换文本中的字符序列。Python中的re
模块提供了对正则表达式的支持。
以下是一些Python中使用正则表达式的常见示例:
导入re
模块
首先,你需要导入re
模块来使用正则表达式功能:
import re
匹配字符串
使用re.match()
函数从字符串的开头开始匹配正则表达式:
pattern = re.compile(r'hello') # 编译正则表达式
match = pattern.match('hello world') # 尝试从字符串开头匹配
if match:
print(match.group()) # 输出匹配到的内容
搜索字符串
使用re.search()
函数搜索整个字符串,找到第一个匹配项:
pattern = re.compile(r'world')
match = pattern.search('hello world')
if match:
print(match.group()) # 输出匹配到的内容
查找所有匹配项
使用re.findall()
函数查找字符串中所有匹配正则表达式的子串:
pattern = re.compile(r'\d+') # 匹配一个或多个数字
matches = pattern.findall('The price is 123 dollars and 45 cents.')
print(matches) # 输出所有匹配到的数字列表:['123', '45']
替换字符串
使用re.sub()
函数替换字符串中匹配正则表达式的部分:
pattern = re.compile(r'\d+') # 匹配一个或多个数字
new_string = re.sub(pattern, 'NUMBER', 'The price is 123 dollars and 45 cents.')
print(new_string) # 输出替换后的字符串:'The price is NUMBER dollars and NUMBER cents.'
分割字符串
使用re.split()
函数根据正则表达式分割字符串:
pattern = re.compile(r'\s+') # 匹配一个或多个空白字符
split_string = re.split(pattern, 'hello world how are you?')
print(split_string) # 输出分割后的字符串列表:['hello', 'world', 'how', 'are', 'you?']
正则表达式元字符
.
:匹配任意字符(除了换行符)*
:匹配前面的子表达式零次或多次+
:匹配前面的子表达式一次或多次?
:匹配前面的子表达式零次或一次{n}
:匹配前面的子表达式恰好n次{n,}
:匹配前面的子表达式至少n次{n,m}
:匹配前面的子表达式从n次到m次^
:匹配字符串的开始$
:匹配字符串的结束\d
:匹配数字(0-9)\D
:匹配非数字字符\w
:匹配字母、数字或下划线\W
:匹配非字母、数字或下划线\s
:匹配空白字符(如空格、制表符、换行符等)\S
:匹配非空白字符\b
:匹配单词边界|
:表示或(or)关系()
:表示一个分组[]
:表示字符集,匹配方括号中的任意一个字符
编译正则表达式
为了多次使用同一个正则表达式,通常先使用re.compile()
函数将其编译为一个正则表达式对象,然后使用该对象的方法来进行匹配和搜索。
这只是正则表达式在Python中的基础使用,正则表达式是一门非常深入的学问,具有非常强大的功能。对于更复杂的匹配需求,你可以学习更多关于正则表达式的知识。
二、Python正则表达式对象
在Python中,当你使用re.compile()
函数编译一个正则表达式字符串时,它会返回一个正则表达式对象。这个对象拥有一系列的方法,可以用来对目标字符串进行匹配、查找、替换和分割等操作。
下面是一个简单的例子,展示了如何创建一个正则表达式对象并使用它的方法:
import re
# 编译正则表达式字符串为一个正则表达式对象
pattern = re.compile(r'\d+')
# 使用正则表达式对象的方法
# 搜索整个字符串,找到第一个匹配项
match = pattern.search('The price is 123 dollars and 45 cents.')
if match:
print(match.group()) # 输出:123
# 查找字符串中所有匹配项
matches = pattern.findall('The price is 123 dollars and 45 cents.')
print(matches) # 输出:['123', '45']
# 替换字符串中所有匹配项
new_string = pattern.sub('NUMBER', 'The price is 123 dollars and 45 cents.')
print(new_string) # 输出:The price is NUMBER dollars and NUMBER cents.
# 分割字符串
split_string = pattern.split('The price is 123 dollars and 45 cents.')
print(split_string) # 输出:['The price is ', ' dollars and ', ' cents.']
# 匹配字符串(从开头开始)
match_start = pattern.match('123 dollars and 45 cents.')
if match_start:
print(match_start.group()) # 输出:123
# 使用正则表达式对象的flags
pattern_ignore = re.compile(r'world', re.IGNORECASE)
match_ignore = pattern_ignore.search('hello WORLD')
if match_ignore:
print(match_ignore.group()) # 输出:world,因为使用了re.IGNORECASE忽略大小写
正则表达式对象的方法通常接受一个字符串作为参数,并返回一个匹配对象(如果找到匹配项的话)或None
(如果没有找到匹配项)。匹配对象(例如match
、search
的返回值)有它自己的方法,如group()
用于获取匹配的文本,start()
和end()
用于获取匹配在字符串中的位置等。
正则表达式对象还可以接受一个可选的flags
参数,用于修改正则表达式的匹配行为。例如,re.IGNORECASE
标志可以使匹配不区分大小写。
正则表达式对象是可重用的,因此如果你打算在多个地方使用同一个正则表达式,编译它一次并使用多次通常更高效。
三、Python正则表达式模式
在Python中,正则表达式模式是由特殊字符和普通字符组成的字符串,用于描述或匹配一系列符合某种规则或条件的字符串。正则表达式模式在re
模块中被用于执行各种字符串操作,如匹配、搜索、替换和分割。
下面是一些常用的正则表达式模式和元字符的示例:
基本元字符
.
:匹配任意字符(除了换行符)^
:匹配字符串的开头$
:匹配字符串的结尾*
:匹配前面的子表达式零次或多次+
:匹配前面的子表达式一次或多次?
:匹配前面的子表达式零次或一次{n}
:匹配前面的子表达式恰好n次{n,}
:匹配前面的子表达式至少n次{n,m}
:匹配前面的子表达式从n次到m次[...]
:字符集,匹配方括号中的任意一个字符\
:转义字符,用于转义特殊字符
示例模式
^hello$
:匹配以"hello"开头并以"hello"结尾的字符串^[a-z]+$
:匹配全部由小写字母组成的字符串^[0-9]{5}$
:匹配恰好由5个数字组成的字符串^\d{3}-\d{2}-\d{4}$
:匹配美国电话号码格式(如:123-45-6789)^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
:匹配电子邮件地址\b\w+\b
:匹配单词(由字母、数字或下划线组成的序列)\d+
:匹配一个或多个数字\s+
:匹配一个或多个空白字符\W+
:匹配一个或多个非字母数字字符
修饰符
re.IGNORECASE
:使匹配对大小写不敏感re.MULTILINE
:多行模式,影响^
和$
的行为re.DOTALL
:使.
匹配任何字符,包括换行符re.VERBOSE
:允许在正则表达式中添加注释,使其更易读
示例使用修饰符
import re
# 使用IGNORECASE修饰符进行不区分大小写的匹配
pattern = re.compile(r'hello', re.IGNORECASE)
match = pattern.search('Hello, World!')
if match:
print(match.group()) # 输出:hello
# 使用MULTILINE和DOTALL修饰符匹配多行文本中的数字
text = """
Line 1: 123 apples
Line 2: 456 oranges
Line 3: 789 bananas
"""
pattern = re.compile(r'\d+', re.MULTILINE | re.DOTALL)
matches = pattern.findall(text)
print(matches) # 输出:['123', '456', '789']
在编写正则表达式时,请确保你清楚每个元字符和修饰符的含义,以便能够准确地描述你想要匹配的字符串模式。正则表达式的强大之处在于其灵活性和表达能力,但同时也需要一定的学习和实践才能熟练掌握。