一、正则表达式概述
正则表达式(Regular Expression,简称regex或RegExp)是一种字符序列,可以用来描述字符串的特征。Python中内置的re模块可以对字符串进行正则表达式匹配、搜索、替换等操作。
正则表达式的基础字符包括普通字符和元字符两种,其中普通字符包括大小写字母、数字和各种符号,而元字符则具有特殊含义,如匹配任意字符、重复n次等。
Python中的正则表达式使用原生字符串进行表示,以r开头的字符串就是原生字符串(raw string),所有的转义字符都不会被转义。
>>> pattern = r'\d+' # 匹配一个或多个数字
>>> string = '123hello456world789'
>>> re.findall(pattern, string)
['123', '456', '789']
二、匹配和搜索
Python中re模块提供了多种方法进行正则表达式的匹配和搜索,其中最常用的方法是findall、search和match。
findall方法可以在字符串中找到所有符合正则表达式的子串,并返回一个列表。如果没有找到,则返回空列表。
>>> pattern = r'\d+' # 匹配一个或多个数字
>>> string = '123hello456world789'
>>> re.findall(pattern, string)
['123', '456', '789']
search方法可以在字符串中搜索到第一个符合正则表达式的子串,如果没有找到,则返回None。
>>> pattern = r'hello'
>>> string = '123hello456world789'
>>> re.search(pattern, string)
<re.Match object; span=(3, 8), match='hello'>
match方法只能在字符串的开头进行匹配,如果没有找到符合正则表达式的子串,则返回None。
>>> pattern = r'^\d+' # 匹配开头的数字
>>> string = '123hello456world789'
>>> re.match(pattern, string)
<re.Match object; span=(0, 3), match='123'>
三、分组和捕获
正则表达式中可以使用小括号来分组,并使用|来分隔多个选择项。可以使用groups方法或group(index)方法获取分组的内容,其中index表示该分组的编号(从1开始)或者名称。
>>> pattern = r'(hello|world), (\d+)' # 匹配"hello, 123"或"world, 456"
>>> string = 'hello, 123; world, 456'
>>> match = re.search(pattern, string)
>>> match.groups()
('hello', '123')
>>> match.group(1)
'hello'
>>> match.group(2)
'123'
如果需要对分组进行捕获,可以在小括号里加上?P<name>来给分组设置一个名称。可以使用groupdict方法获取分组的内容字典。
>>> pattern = r'(?P<fruit>\w+), (?P<count>\d+)' # 匹配"apple, 3"等
>>> string = 'apple, 3; banana, 2'
>>> match = re.search(pattern, string)
>>> match.groupdict()
{'fruit': 'apple', 'count': '3'}
四、替换和修改
Python中的re.sub方法可以用来对字符串进行替换。替换时,可以使用正则表达式来匹配要替换的内容,并将替换内容作为第二个参数传入。如果要保留原字符串中原始内容,则可以在替换内容中使用\g<name>表示引用该分组的内容。
>>> pattern = r'(\d+)/(\d+)/(\d+)' # 匹配日期格式"yyyy/mm/dd"
>>> string = 'today is 2022/01/01'
>>> re.sub(pattern, r'\3-\1-\2', string)
'today is 01-2022-01'
除了替换外,还可以使用re.split方法对字符串进行分割。如果要在特定的字符串位置进行分割,则可以使用正则表达式来匹配该位置。
>>> pattern = r'[\s,;]' # 匹配空格、逗号和分号
>>> string = 'hello, world; python is easy'
>>> re.split(pattern, string)
['hello', '', 'world', '', 'python', 'is', 'easy']
五、高级应用
除了基本功能外,Python还可以使用正则表达式实现一些复杂的功能。例如,可以使用前后向匹配来进行断言,或者使用re模块的子模块regex进行更高级的正则表达式操作。
>>> pattern = r'(?<=hello )\w+' # 匹配以"hello "开头的单词
>>> string = 'hello world, hello python'
>>> re.findall(pattern, string)
['world', 'python']
可以在正则表达式中使用条件匹配,根据不同条件进行不同的匹配。例如,可以根据不同的操作系统选择不同的文件分隔符。
>>> pattern = r'(\\. |\\/)+'
>>> string = 'hello\\world/world\\python'
>>> re.split(pattern, string)
['hello', 'world', 'python']
六、总结
使用Python正则表达式进行文本匹配和提取可以极大地简化字符串处理的工作。对于复杂的字符串处理,正则表达式可以提供更加方便和高效的解决方案。掌握了正则表达式的各种语法和功能,可以让我们在处理文本数据时事半功倍。