📜  Python正则表达式备忘单(1)

📅  最后修改于: 2023-12-03 15:34:30.901000             🧑  作者: Mango

Python正则表达式备忘单

正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串的强大工具。它使用特殊的语法规则来描述字符集合的组合,从而能够高效、准确地匹配各种类型的字符串。Python中的正则表达式可以使用re模块来实现,在程序开发中经常使用。

正则表达式基础概念
  • 元字符(Metacharacters):指在正则表达式中有特殊含义的字符,如.*+?等。
  • 转义字符(Escape characters):指在正则表达式中需要使用\来转义的字符,如\(\)\.等。
  • 字符集合(Character set):指一组用方括号([])括起来的字符,其中任意一个字符都能匹配。
  • 重复次数(Repetitions):指一个元字符或者一个字符集合出现的次数,如*+?{m}{m,n}等。
  • 匹配模式(Match mode):指在正则表达式中指定的一些匹配模式,如忽略大小写(re.I)、多行模式(re.M)、单行模式(re.S)等。
基本用法
re.compile(pattern[, flags])
  • 将正则表达式的字符串形式编译成正则表达式对象,并返回该对象。
  • pattern为正则表达式的字符串形式,flags为可选参数,表示匹配模式。
  • 示例:
import re

pattern = re.compile(r'\d+')
strs = 'abc123def456'
result = pattern.findall(strs)
print(result) # ['123', '456']
re.match(pattern, string[, flags])
  • 尝试在字符串的起始位置匹配正则表达式,如果匹配成功则返回匹配对象,否则返回None
  • pattern为正则表达式的字符串形式,string为需要匹配的字符串,flags为可选参数,表示匹配模式。
  • 示例:
import re

pattern = re.compile(r'\d+')
strs = 'abc123def'
result = pattern.match(strs)
print(result.group(0)) # '123'
re.search(pattern, string[, flags])
  • 在字符串中搜索正则表达式匹配的第一个位置,并返回匹配对象,否则返回None
  • pattern为正则表达式的字符串形式,string为需要匹配的字符串,flags为可选参数,表示匹配模式。
  • 示例:
import re

pattern = re.compile(r'\d+')
strs = 'abc123def456'
result = pattern.search(strs)
print(result.group(0)) # '123'
re.findall(pattern, string[, flags])
  • 在字符串中查找正则表达式的所有匹配,并返回匹配结果的列表。
  • 对于出现次数无限的元字符 *+?{m,n},返回的结果可能会包含多个相邻的匹配。
  • pattern为正则表达式的字符串形式,string为需要匹配的字符串,flags为可选参数,表示匹配模式。
  • 示例:
import re

pattern = re.compile(r'\d+')
strs = 'abc123def456'
result = pattern.findall(strs)
print(result) # ['123', '456']
re.finditer(pattern, string[, flags])
  • 在字符串中查找正则表达式的所有匹配,并返回一个迭代器,其中每个元素为匹配对象。
  • 对于出现次数无限的元字符 *+?{m,n},可能会有多个相邻的匹配,每个匹配独立成为一个迭代器中的元素。
  • pattern为正则表达式的字符串形式,string为需要匹配的字符串,flags为可选参数,表示匹配模式。
  • 示例:
import re

pattern = re.compile(r'\d+')
strs = 'abc123def456'
result = pattern.finditer(strs)
for item in result:
    print(item.group(0)) # '123', '456'
re.split(pattern, string[, maxsplit=0, flags=0])
  • 根据正则表达式分割字符串,并返回分割结果的列表。
  • pattern为正则表达式的字符串形式,string为需要分割的字符串,maxsplit为可选参数,表示最大分割次数,flags为可选参数,表示匹配模式。
  • 示例:
import re

pattern = re.compile(r'\s+')
strs = 'a b\tc   d'
result = pattern.split(strs)
print(result) # ['a', 'b', 'c', 'd']
re.sub(pattern, repl, string[, count=0, flags=0])
  • 根据正则表达式将字符串中符合条件的字符进行替换,并返回替换后的结果。
  • pattern为正则表达式的字符串形式,repl为替换字符串的字符串形式,string为需要替换的字符串,count为可选参数,表示替换次数,flags为可选参数,表示匹配模式。
  • 示例:
import re

pattern = re.compile(r'\s+')
strs = 'a b\tc   d'
result = pattern.sub('-', strs)
print(result) # 'a-b-c-d'
正则表达式语法
元字符

下面是正则表达式中的一些元字符,它们在匹配字符串时会被特殊处理。

| 元字符 | 描述 | | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | . | 匹配除了换行外任何字符。 | | ^ | 匹配字符串的开始位置。如果开启了多行模式(re.M),则还可以匹配连续换行符后的位置。 | | $ | 匹配字符串的结束位置。如果开启了多行模式(re.M),则还可以匹配换行符前的位置。 | | [] | 匹配括号内的任意一个字符。支持使用-表示范围,如[a-z][A-Z][0-9]等。还支持使用^表示取反,如[^a-z]表示匹配任意一个不属于a-z的字符。 | | \ | 转义字符。可以将元字符转义为普通字符进行匹配,也可以将普通字符转义为特殊的匹配方式,如\d表示匹配任意一个数字,等同于[0-9]。 | | * | 匹配前面的元字符重复0次或多次,等同于{0,}。 | | + | 匹配前面的元字符重复1次或多次,等同于{1,}。 | | ? | 匹配前面的元字符重复0次或1次,等同于{0,1}。 | | {m} | 匹配前面的元字符重复m次。 | | {m,n}| 匹配前面的元字符重复m~n次。如果mn都省略,则等同于*;如果m省略而n未省略,则等同于{0,n};如果n省略则表示至少匹配m次。 | | \d | 匹配任意一个数字,等同于[0-9]。 | | \D | 匹配任意一个非数字字符,等同于[^0-9]。 | | \w | 匹配任意一个字母数字字符,等同于[a-zA-Z0-9_]。 | | \W | 匹配任意一个非字母数字字符,等同于[^a-zA-Z0-9_]。 | | \s | 匹配任意一个空白字符,包括空格、制表符、换行符等。等同于[ \t\n\r\f\v]。 | | \S | 匹配任意一个非空白字符。 |

表达式

在正则表达式中,可以使用括号()进行分组。分组可以被认为是一个整体,因此可以对分组内的内容进行重复、替换等操作。

例如,正则表达式(\d{3})\w+(\d{3})可以分为两个分组,第一个分组匹配任意三个数字,第二个分组匹配任意三个数字。其中\w匹配一个字母、数字或下划线,+表示前面的元字符可以出现一次或多次。这个正则表达式可以匹配类似于123abc456的字符串,并且将123456分别作为第一个和第二个分组的内容。

在正则表达式中,支持使用|表示或关系,支持使用(?:)表示非捕获分组,支持使用(?P<name>)表示命名分组。

匹配模式

在正则表达式中,可以使用匹配模式来改变匹配的行为。一些常用的匹配模式如下:

  • re.I(等同于re.IGNORECASE):忽略大小写。
  • re.M(等同于re.MULTILINE):开启多行模式,使^$分别匹配每行的开头和结尾。
  • re.S(等同于re.DOTALL):开启单行模式,使.匹配任意字符,包括换行符。
  • re.U(等同于re.UNICODE):开启Unicode模式,使\w\W\b\B\d\D\s\S.等元字符能够正确处理Unicode字符串。
  • re.X(等同于re.VERBOSE):开启详细模式,允许在正则表达式中使用空格和注释等,并忽略空格。
示例

下面是一些常用的正则表达式示例,可以供参考使用。

  • 匹配手机号(中国大陆):
import re

pattern = re.compile(r'^(?:\+86)?1[3-9]\d{9}$')
phone = '13800138000'

result = pattern.match(phone)
if result:
    print(f'{phone} is a valid phone number.')
else:
    print(f'{phone} is not a valid phone number.')
  • 匹配邮箱地址:
import re

pattern = re.compile(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$')
email = 'someone@example.com'

result = pattern.match(email)
if result:
    print(f'{email} is a valid email address.')
else:
    print(f'{email} is not a valid email address.')
  • 匹配URL地址:
import re

pattern = re.compile(r'^(?:http|https)://(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(?:/[a-zA-Z0-9-._?=\+#%&]+)*$')
url = 'http://www.example.com/test?a=b&c=d#top'

result = pattern.match(url)
if result:
    print(f'{url} is a valid URL.')
else:
    print(f'{url} is not a valid URL.')
  • 匹配IP地址:
import re

pattern = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
ip = '192.168.1.1'

result = pattern.match(ip)
if result:
    print(f'{ip} is a valid IP address.')
else:
    print(f'{ip} is not a valid IP address.')
  • 匹配密码强度(6-18位,必须包含字母和数字):
import re

pattern = re.compile(r'^(?=.*[0-9])(?=.*[a-zA-Z]).{6,18}$')
password = 'password123'

result = pattern.match(password)
if result:
    print(f'{password} is a strong password.')
else:
    print(f'{password} is not a strong password.')

以上仅是部分正则表达式的使用场景,更多的用法需要自己去实践、去探索。希望这份Python正则表达式备忘单可以对大家有所帮助。