作者:禅与计算机程序设计艺术
今天我们将学习Python中的正则表达式。正则表达式(Regular Expression)在计算机领域中是一个重要的工具,它可以帮助你快速、准确地查找、替换文字或者字符串中的特定模式。本文涵盖的内容主要是从零开始,带着大家进入正则表达式的世界。如果你已经了解了基本的Python语法和数据类型,那么本文应该能够帮助你深入理解正则表达式。
正则表达式(Regular Expression),也称为正规表示法,是一种特殊的字符序列,它描述了一条或多条匹配的规则。它的功能类似于一个常规搜索引擎,但其搜索规则比一般的搜索更为精确,能更好地控制和取代文本内容。Python中的re模块提供了对正则表达式进行处理的函数。
Python中的正则表达式语法非常简单,总体来说分为三个部分:
^
: 表示行的开头。$
: 表示行的结尾。.
: 表示任意单个字符(除了换行符)。举例:
import re
pattern = "^hello"
string = "hello world!"
match_obj = re.search(pattern, string)
if match_obj:
print("Match found at index", match_obj.start())
else:
print("No match")
以上代码可以用来判断字符串是否以“hello”开头,如果字符串中含有“hello”,则会输出其位置索引值。
再如,以下代码用于查找一个数字串中连续出现的3个数字。
import re
pattern = r"\d{3}"
string = "The number is 12345."
matches = re.findall(pattern, string)
print(matches)
以上代码可以输出所有连续出现的3个数字:[‘123’, ‘45’]。
当然,正则表达式还有很多种用法,本文所涉及到的只是很小的一部分。
正则表达式,又称规则表达式,是一种文本模式,用来匹配字符串中符合某些规则的子串。常见的应用场景包括验证邮箱地址、URL、电话号码等;字符串截取、替换、检索、排序、过滤等等。
正则表达式的优点在哪里?为什么大家都喜欢用正则表达式?
首先,正则表达式的速度非常快,对于一些复杂的字符串匹配,相比传统的循环匹配,它的速度可是提升了不少。其次,正则表达式能有效地简化代码,避免了很多无聊且重复的工作。再次,正则表达式有着丰富的功能和强大的自定义能力,可以匹配各种各样的字符串模式。最后,正则表达式有着完善的文档支持,几乎任何开发者都会喜欢上它。
先举个简单的例子,看一下如何使用正则表达式去匹配一个邮箱地址:
import re
email = ""
match_result = re.match("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email)
if match_result:
print('Valid Email')
else:
print('Invalid Email')
上面的代码将匹配以字母、数字、下划线、百分号、加号、句点组成的邮箱地址。具体流程如下:
首先导入re模块,然后创建待匹配的字符串email。接着,使用re.match()方法对email进行匹配。这里传入的参数是正则表达式,它指定了邮箱地址的规则。这个正则表达式如下:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
那该怎么理解这个正则表达式呢?
^
: 表示行的开头。[a-zA-Z0-9._%+-]+
: 匹配至少一个字母、数字、下划线、百分号、加号的组合,即用户名。@
: 表示邮箱的隔离符号。[a-zA-Z0-9.-]+
: 匹配至少一个字母、数字、下划线、句点的组合,即域名。\.
: 表示句点的转义字符。[a-zA-Z]{2,}
: 匹配至少两个英文字母的组合,作为顶级域名。$
: 表示行的结尾。用途很广,比如密码校验、网页爬虫等等。
还可以进一步拓展这个正则表达式:
import re
emails = ['' , '[email protected]' ,'invalid-email!example.com']
for email in emails:
# 使用re.match()方法对email进行匹配
match_result = re.match("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", email)
if not match_result:
print('%s is Invalid' % email)
else:
print('%s is Valid'% email)
其中,emails是一个列表,包含多个邮箱地址。使用for循环遍历列表,对每个邮箱地址调用re.match()方法进行匹配。若成功匹配,则打印“Valid”,否则打印“Invalid”。
其他的一些匹配规则,比如手机号码匹配、身份证号码匹配等,也是可以通过正则表达式完成。
模式(Pattern)是正则表达式的基础,它是由普通字符(例如:字母,数字和符号)以及特殊字符(称为元字符)组成的文字模板。这些模板可以让你方便地表示对字符串的各种匹配或替代操作。
正则表达式是一个高度优化的匹配算法,通过设置一些规则来描述字符序列的模式。当搜索模式与输入字符串相匹配时,正则表达式引擎便返回一个匹配结果。
我们用一个示例来理解模式的概念。假设有一个字符串"Hello World!“,希望匹配出第一个"World”。
模式就是这样,它告诉正则表达式引擎,在某个位置应当匹配什么样的东西。
模式的基本元素包括:字母(A-Za-z),数字(0-9),字符类(如:\w, \d,., |, [, ], ( ), { })以及空白字符(例如:空格、制表符等)。
边界匹配是在特定情况下使用的特殊字符。它们可以让你限定模式的匹配范围,有助于减少匹配的错误率。
正则表达式也可以用来替换字符串中的内容,也就是说,你可以根据指定的模式替换掉原有的字符序列,从而实现一定的文本处理功能。
replace() 方法用于替换字符串中的匹配项。
例如:
import re
text = 'This is some text -- with punctuation.'
new_text = re.sub('\W+', '', text) # 删除标点符号和空白字符
print(new_text)
输出:
Thiss is somt txwt - wth punctuatn.
另一个例子:
import re
text = '''Line 1
Line 2 has two spaces after it.'''
new_text = re.sub('\s+','', text).strip() # 用单个空格替换多个空格并删除首尾空格
print(new_text)
输出:
Line 1 Line 2 has two spaces after it.
此外,还有很多其他的替换操作可以使用,比如删除换行符 \n
,将字符串中所有的大写转换为小写 lower()
,将所有数字转换为常量 int()
,甚至可以编写自己的函数来实现特定的替换逻辑。
正则表达式标准库提供了一些预定义的模式,可以用作匹配或替换的基本模式。它们包括:
\d
匹配任意十进制数字。\D
匹配任意非十进制数字。\s
匹配任意空白字符,包括空格、制表符、换行符。\S
匹配任意非空白字符。\w
匹配任意字母、数字和下划线。\W
匹配任意非字母、数字和下划线。字符类允许你匹配一组字符中的任何一个字符。
####.
除了字符类以外,模式还可以包含一些元字符来限定其出现次数。
####?
模式还可以包含一些元字符来实现分支选择。
后向引用是一个比较复杂的特性,它允许你引用之前已匹配到的文本。
正则表达式的默认行为是贪婪的。也就是说,正则表达式会尽可能多地匹配文本中的字符,直到遇到无法匹配的情况。这种做法可能会导致一些匹配上的困难,但它会让正则表达式更容易使用。
当你想要编写一个更灵活的匹配方案时,可以添加限定符来改变这种默认行为。
####?
####??