1. 前言
正则表达式是一种文本模式,用来匹配和搜索文本中符合某种规则的字符串。Python中有re模块用来处理正则表达式。正则表达式语法是工作中必须掌握的技能之一,因此本文将详细介绍Python中的正则表达式语法。
2. 基本语法
2.1 普通字符
在正则表达式中,普通字符包括大小写字母、数字和标点符号等。这些字符在正则表达式中直接匹配文本中的对应字符,例如:
import re
text = 'hello world'
pattern = 'world'
result = re.findall(pattern, text)
print(result)
输出结果为:
['world']
在上面的代码中,我们使用re.findall()函数来找到文中出现'world'的所有结果,返回一个列表。
2.2 特殊字符
正则表达式中还有一些特殊字符,用来表示特定的字符类别或者字符集合,比如:
. :匹配任意单个字符,除了换行符。
^ :匹配字符串的开头。
$ :匹配字符串的结尾。
例如,我们可以使用以下代码来检查一个字符串是否以'hello'开头:
import re
text = 'hello world'
pattern = '^hello'
result = re.findall(pattern, text)
print(result)
输出结果为:
['hello']
2.3 字符集
字符集用方括号[]括起来,匹配其中的任意一个字符,例如:
import re
text = 'cat, hat, bat, rat'
pattern = '[cr]at'
result = re.findall(pattern, text)
print(result)
输出结果为:
['cat', 'rat']
上述代码中,字符集中包含了'c'和'r',因此只有'cat'和'rat'会被匹配。
2.4 量词
量词用来描述匹配的次数,例如:
* :匹配0次或多次。
+ :匹配1次或多次。
? :匹配0次或1次。
{m} :匹配恰好m次。
{m,} :匹配至少m次。
{m,n} :匹配至少m次,至多n次。
例如,以下代码中的正则表达式将匹配至少一个'a',后面跟着任意数量的'b':
import re
text = 'abb ab abbbb'
pattern = 'ab+'
result = re.findall(pattern, text)
print(result)
输出结果为:
['abb', 'ab', 'abbbb']
2.5 分组
在正则表达式中,可以使用小括号()来表示一个分组,如:
import re
text = 'Tom 24, Jack 30, Lily 28'
pattern = '(\w+) (\d+)'
result = re.findall(pattern, text)
print(result)
输出结果为:
[('Tom', '24'), ('Jack', '30'), ('Lily', '28')]
上述代码中,用小括号将\w+和\d+括起来,表示一个分组,re.findall()函数返回了一个列表,每个元素是一个由分组匹配到的字符串组成的元组。
3. 实例
3.1 匹配邮箱
匹配邮箱的正则表达式非常复杂,下面是一个比较简单的正则表达式:
import re
email = 'zhangsan123@qq.com'
pattern = '\w+@\w+\.\w+'
result = re.findall(pattern, email)
print(result)
输出结果为:
['zhangsan123@qq.com']
上述代码中,用\w+匹配邮箱的用户名部分,用\w+\.\w+匹配邮箱的域名部分。
3.2 匹配URL
匹配URL同样也是一个比较复杂的问题,下面是一个比较简单的正则表达式:
import re
url = 'http://www.baidu.com/'
pattern = 'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'
result = re.findall(pattern, url)
print(result)
输出结果为:
['http://www.baidu.com/']
上述代码中,用https?匹配协议部分,用[-\w.]|(?:%[\da-fA-F]{2}))+匹配主机名和路径部分,并且使用(?:...)来表示一个非捕获分组,匹配URL时,不需要获取分组中的内容,只需要获取整个匹配结果即可。
3.3 转义字符
在正则表达式中,有些字符具有特殊意义,如$、^、*等,如果要匹配这些字符本身,需要使用反斜杠\进行转义。
import re
text = 'The price is $9.99'
pattern = '\$[\d\.]+'
result = re.findall(pattern, text)
print(result)
输出结果为:
['$9.99']
上述代码中,用\$匹配$符号,用[\d\.]+匹配一个或多个数字或小数点。
3.4 替换字符串
除了查找是否匹配外,使用re模块还可以对字符串进行替换,如:
import re
text = 'The quick brown fox jumps over the lazy dog'
pattern = 'fox'
replace = 'cat'
new_text = re.sub(pattern, replace, text)
print(new_text)
输出结果为:
The quick brown cat jumps over the lazy dog
上述代码中,使用re.sub()函数将字符串text中所有匹配到的'fox'替换成'cat'。
4. 总结
Python中的正则表达式语法是一个非常强大的工具,使用它可以快速地对一些文本进行处理和匹配。本文介绍了常用正则表达式的基本语法,包括普通字符、特殊字符、字符集、量词和分组等。同时,本文还通过实例展示了如何使用正则表达式来匹配电子邮件地址、URL和替换字符串。在实际工作中,我们还需要不断练习和积累经验,才能熟练地使用正则表达式。