Python 正则表达式查找字符串
在Python中,正则表达式经常用于查找、匹配和替换字符串中的内容。正则表达式是一种描述性的语言,它使用特定的语法规则来查找文本中的模式。Python通过re模块提供对正则表达式的支持,可以使用re模块提供的函数来创建、编译和使用正则表达式。
正则表达式基础
正则表达式由普通字符(例如’a’到’z’、’A’到’Z’、’0’到’9’)和特殊字符(称为元字符)组成。元字符可以用来定义字符串中的位置、字符集、重复次数等。
下面是常见的元字符:
.
:匹配任意一个字符(除了换行符)^
:匹配字符串开头$
:匹配字符串结尾*
:表示前面的字符可以重复出现0到多次+
:表示前面的字符可以重复出现1到多次?
:表示前面的字符可以重复出现0到1次{m}
:表示前面的字符重复出现m次{m,}
:表示前面的字符至少重复出现m次{m,n}
:表示前面的字符重复出现m到n次[]
:表示字符集,匹配其中的任意一个字符|
:或运算,匹配两个选择中的任意一个
例如,正则表达式a.*b
可以匹配以a
开头,以b
结尾且中间包含任意个字符的字符串。
re模块基础
Python内置的re模块提供了一组函数来使用正则表达式。以下是re模块中最常用的函数:
re.search
re.search
函数在指定的字符串中查找第一个与正则表达式匹配的子串,并返回一个匹配对象。如果找到,则可以使用group方法获取匹配的子串。如果没找到,则返回None。
例如,下面的代码展示了如何使用re.search函数查找字符串中的子串:
import re
pattern = 'hello'
string = 'hello world'
match_obj = re.search(pattern, string)
if match_obj:
print(match_obj.group()) # 输出hello
else:
print('未匹配到该字符串')
re.match
re.match
函数也是在指定的字符串中查找第一个与正则表达式匹配的子串,并返回一个匹配对象。但是,re.match
函数只会在字符串开头进行匹配,如果匹配成功,则返回匹配对象,否则返回None。
例如,下面的代码展示了如何使用re.match函数查找字符串中的子串:
import re
pattern = 'hello'
string = 'hello world'
match_obj = re.match(pattern, string)
if match_obj:
print(match_obj.group()) # 输出hello
else:
print('未匹配到该字符串')
re.findall
re.findall
函数在指定的字符串中查找所有与正则表达式匹配的子串,并以列表形式返回结果。如果没有匹配到,则返回空列表。
例如,下面的代码展示了如何使用re.findall函数查找字符串中的子串:
import re
pattern = '[0-9]+'
string = '2019年是中华人民共和国成立70周年'
match_obj = re.findall(pattern, string)
print(match_obj) # 输出['2019', '70']
re.sub
re.sub
函数将匹配正则表达式的子串替换为指定的字符串,并返回替换后的字符串。如果没有匹配的子串,则返回原始的字符串。
例如,下面的代码展示了如何使用re.sub函数替换字符串中的子串:
import re
pattern = 'hello'
string = 'hello world'
replace_str = 'hi'
new_string = re.sub(pattern, replace_str, string)
print(new_string) # 输出hi world
正则表达式高级用法
除了基础用法,正则表达式还支持一些高级用法。
分组
分组可以将多个正则表达式组合成一个更复杂的正则表达式。通过括号将要匹配的子串括起来,可以实现分组。通过group
方法可以获取每个分组匹配到的子串。
例如,正则表达式(\w+) (\w+)
用于匹配由英文字母组成的字符串中的前两个单词,其中\w
表示匹配任意字母、数字或下划线。
下面的代码展示了如何使用分组查找字符串中的子串:
import re
pattern = r'(\w+) (\w+)'
string = 'hello world'
match_obj = re.search(pattern, string)
if match_obj:
print(match_obj.group(0)) # 输出hello world,完整的匹配字符串
print(match_obj.group(1)) # 输出hello,第一个分组匹配到的子串
print(match_obj.group(2)) # 输出world,第二个分组匹配到的子串
else:
print('未匹配到该字符串')
非贪婪匹配
默认情况下,正则表达式是贪婪的,即在匹配时尽可能多地匹配字符。例如,正则表达式a.+b
会匹配字符串a test string b another string b
中的整个字符串,而不是期望的两个子串。为了改变这种默认行为,可以使用非贪婪匹配。
非贪婪匹配使用?
元字符来实现。例如,正则表达式a.+?b
会匹配字符串a test string b another string b
中的两个子串。
下面的代码展示了如何使用非贪婪匹配查找字符串中的子串:
import re
pattern = r'a.+?b'
string = 'a test string b another string b'
match_obj = re.search(pattern, string)
if match_obj:
print(match_obj.group()) # 输出a test string b
else:
print('未匹配到该字符串')
使用编译的正则表达式
正则表达式在使用时需要先编译,然后才能使用。编译正则表达式可以提高程序的效率,避免多次重复编译,同时编译后的正则表达式可以在多个函数中共享。
可以使用re.compile
函数来编译正则表达式。这个函数会返回一个正则表达式对象,可以在之后使用其他re模块函数来对其中的字符串进行操作。
例如,下面的代码展示了如何使用编译的正则表达式来查找字符串中的子串:
import re
pattern = r'[0-9]+'
string = '2019年是中华人民共和国成立70周年'
regex = re.compile(pattern)
match_obj = regex.findall(string)
print(match_obj) # 输出['2019', '70']
结论
正则表达式是一个非常强大的工具,可以用于查找、匹配和替换字符串中的内容。Python内置的re模块提供了一组函数来使用正则表达式,可以使用这些函数来创建、编译和使用正则表达式。掌握正则表达式的基础和高级用法,可以大大提高处理字符串的效率和灵活性。