📅  最后修改于: 2023-12-03 15:34:30.901000             🧑  作者: Mango
正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串的强大工具。它使用特殊的语法规则来描述字符集合的组合,从而能够高效、准确地匹配各种类型的字符串。Python中的正则表达式可以使用re模块来实现,在程序开发中经常使用。
.
、*
、+
、?
等。\
来转义的字符,如\(
、\)
、\.
等。[]
)括起来的字符,其中任意一个字符都能匹配。*
、+
、?
、{m}
、{m,n}
等。re.I
)、多行模式(re.M
)、单行模式(re.S
)等。pattern
为正则表达式的字符串形式,flags
为可选参数,表示匹配模式。import re
pattern = re.compile(r'\d+')
strs = 'abc123def456'
result = pattern.findall(strs)
print(result) # ['123', '456']
None
。pattern
为正则表达式的字符串形式,string
为需要匹配的字符串,flags
为可选参数,表示匹配模式。import re
pattern = re.compile(r'\d+')
strs = 'abc123def'
result = pattern.match(strs)
print(result.group(0)) # '123'
None
。pattern
为正则表达式的字符串形式,string
为需要匹配的字符串,flags
为可选参数,表示匹配模式。import re
pattern = re.compile(r'\d+')
strs = 'abc123def456'
result = pattern.search(strs)
print(result.group(0)) # '123'
*
、+
、?
和{m,n}
,返回的结果可能会包含多个相邻的匹配。pattern
为正则表达式的字符串形式,string
为需要匹配的字符串,flags
为可选参数,表示匹配模式。import re
pattern = re.compile(r'\d+')
strs = 'abc123def456'
result = pattern.findall(strs)
print(result) # ['123', '456']
*
、+
、?
和{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'
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']
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次。如果m
和n
都省略,则等同于*
;如果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
的字符串,并且将123
和456
分别作为第一个和第二个分组的内容。
在正则表达式中,支持使用|
表示或关系,支持使用(?:)
表示非捕获分组,支持使用(?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.')
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.')
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.')
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正则表达式备忘单可以对大家有所帮助。