正则表达式
什么是正则表达式:简单来说就是通过特殊符号匹配想要的字符串,正则表达式本身就是基于字符串的一套搜索规则,掌握了正则表达式对于字符串有了更深的把握和理解。
概念
官网概念:正则表达式(Regular Expression,简称regex或regexp)是一种用于匹配字符串的模式。它由一系列字符和元字符组成,可以用来检查一个字符串是否包含某种模式、替换字符串中的某些部分,或者从字符串中提取符合某种模式的子串。Python中的正则表达式通过re
模块提供支持。
应用
-
web应用(密码校验、用户名校验、邮箱校验)
-
网络爬虫
写法
r'字符或者元字符'
注意不要丢了r,r丢了就不是正则表达式了(比如\是元字符,加r就是告诉计算机这个是正则表达式不要给我转义)
构成
-
普通字符:如字母、数字、空格等,它们匹配自身。
-
元字符:具有特殊意义的字符,用于定义匹配模式。
常见元字符
元字符 | 描述 |
---|---|
. |
匹配除换行符以外的任意单个字符。 |
^ |
匹配字符串的开头。 |
$ |
匹配字符串的结尾。 |
* |
匹配前面的字符 0 次或多次。 |
+ |
匹配前面的字符 1 次或多次。 |
? |
匹配前面的字符 0 次或 1 次。 |
{n} |
匹配前面的字符恰好 n 次。 |
{n,} |
匹配前面的字符至少 n 次。 |
{n,m} |
匹配前面的字符至少 n 次,至多 m 次。 |
\d |
匹配任意数字字符,等价于 [0-9] 。 |
\D |
匹配任意非数字字符,等价于 [^0-9] 。 |
\w |
匹配任意字母、数字或下划线字符,等价于 [a-zA-Z0-9_] 。 |
\W |
匹配任意非字母、数字或下划线字符,等价于 [^a-zA-Z0-9_] 。 |
\s |
匹配任意空白字符(包括空格、制表符、换行符等)。 |
\S |
匹配任意非空白字符。 |
[] |
匹配括号内的任意一个字符。例如 [abc] 匹配 a 、b 或 c 。 |
| | 或的意思。|前后只要有满足条件的就可以作为结果返回。 |
() |
分组,将多个字符作为一个整体进行匹配。 |
\ |
转义字符,用于匹配元字符本身。例如 \. 匹配 . 。 |
大家一定要练练,顺道可以使用函数感受不同函数,最后在不断的优化和整理判断
python
import re
'''
使用match 函数测试 从字符串的起始位置匹配正则表达式,
match 函数用法:re.match(正则表达式, 要验证的字符串)
如果匹配成功返回匹配对象,否则返回None。 match 会返回对象注意了后面根据is not None返回True或者False
'''
# . 匹配除换行符以外的任意单个字符。 a.b 匹配 aab、acb,但不匹配 a\nb
result = re.match(r'a.b', 'a\nb') is not None
print('元字符.的使用:%s' % result)
# ^ 匹配字符串的开头。 ^abc 匹配 abcdef,但不匹配 defabc
result = re.match(r'^abc', 'abcdef') is not None
print('元字符^的使用:%s' % result)
# $ 匹配字符串的结尾。 abc$ 匹配 defabc,但不匹配 abcdef
result = re.match(r'abc$', 'defabc') is not None
print('元字符$的使用:{}'.format(result))
# * 匹配前面的字符 0 次或多次。 ab* 匹配 a、ab、abb、abbb,aab等 不匹配cd ba
result = re.match(r'ab*', 'ba') is not None
print(f'元字符*的使用:{result}')
# + 匹配前面的字符 1 次或多次。 ab+ 匹配 ab、abb、abbb,但不匹配 a,ba
result = re.match(r'ab+', 'ba') is not None
print('元字符+的使用:',result)
# ? 匹配前面的字符 0 次或 1 次,通常用于表示某个字符或分组是可选的。ab? 匹配 a、ab、abbb 不匹配的话 ba
result = re.match(r'ab?', 'abbb') is not None
print('元字符?的使用:',result)
# {n} 匹配前面的字符恰好 n 次。a{3} 匹配 aaa,但不匹配 aa 或 aaaa。
# 这里注意了re.match() 函数用于从字符串的 起始位置 开始匹配正则表达式。如果匹配成功,返回一个匹配对象;如果匹配失败,返回 None
# match函数会返回对象的不能使用这个match来匹配了 否则aaaa会返回错误的
# 完全匹配整个字符串,而不是只匹配开头部分,可以使用 re.fullmatch():
# result = re.match(r'a{3}', 'aaaa') is not None
result = re.fullmatch(r'a{3}', 'aaaa') is not None
print('元字符{n}的使用:',result)
# {n,} 匹配前面的字符至少 n 次。a{2,} 匹配 aa、aaa、aaaa,但不匹配 a。
result = re.match(r'a{2,}', 'a') is not None
print('元字符{n,}的使用:',result)
# {n,m} 匹配前面的字符至少 n 次,至多 m 次。a{2,4} 匹配 aa、aaa、aaaa,但不匹配 a 或 aaaaa。 跟{n}情况一样 需要使用fullmatch
# 给大家留了一个备注大家可以打开使用看下aaaaa的结果
# result = re.match(r'a{2,4}', 'aaaaa') is not None
result = re.fullmatch(r'a{2,4}', 'aaaaa') is not None
print('元字符{n,m}的使用:',result)
# \d 匹配任意数字字符,等价于[0-9]。\d 匹配123、或者任意数字正确 匹配非数字错误123test
# 注意了 这里也是使用了fullmatch下面这种情况是正确的
# result = re.match(r'\d', '123test') is not None 使用findall() 返回字符串中所有匹配的子串,返回一个列表。
result = len(re.findall(r'\d', '123')) > 0
print('元字符\\d的使用:',result)
# \D 匹配任意非数字字符,等价于[^0-9]。\D+ 匹配 abc、@#$ 等。
result =len(re.findall(r'\D', '@#$')) > 0
print('元字符\\D的使用:',result)
# \w 匹配任意字母、数字或下划线字符,等价于[a-zA-Z0-9_]。 \w+ 匹配 abc123、user_name 等。不匹配$$$
result =len(re.findall(r'\w', '$$$')) > 0
print('元字符\\w的使用:',result)
# \W 匹配任意非字母、数字或下划线字符,等价于[^a-zA-Z0-9_]。 \W+ 匹配 $$$,不匹配abc123
result =len(re.findall(r'\W', 'abc123')) > 0
print('元字符\\W的使用:',result)
# \s 匹配任意空白字符(包括空格、制表符、换行符等)。 \s、\t(制表符)、\n(换行符)等。不匹配其他的abc、123
result =len(re.findall(r'\W', '\n')) > 0
print('元字符\\s的使用:',result)
# \S 匹配任意非空白字符。\S+ 匹配 abc、123 等。\S+ 匹配 abc、123 不匹配\s、\t(制表符)、\n(换行符)等
result =len(re.findall(r'\S', '\n')) > 0
print('元字符\\S的使用:{}'.format(result))
# [] 匹配括号内的任意一个字符。例如[abc]匹配a、b或c。[abc] 匹配 a、b 或 c 不匹配 def
result =len(re.findall(r'[abc]', 'def')) > 0
print('元字符[]的使用:%s'% result)
# | 或的意思。|前后只要有满足条件的就可以作为结果返回。|a b匹配a或b`。
# 这儿注意了 这个| 会返回['', '', '', ''] 空列表所以需要再加上去空 过滤 list(filter(None, 列表))
# result =len(re.findall(r'|a|ab', 'def')) > 0
result = len(list(filter(None, re.findall(r'|a|ab', 'def')))) > 0
print(f'元字符|的使用:{result}')
# ()分组,将多个字符作为一个整体进行匹配。 (abc)+ 匹配 abc、abcabc 等。不匹配 abdec
result = len(list(filter(None, re.findall(r'(abc)', 'abdec')))) > 0
print(f'元字符()的使用:{result}')
# \ 转义字符,用于匹配元字符本身。例如\.匹配.。 \. 匹配 .,\* 匹配 * 匹配:.abc 不匹配: #abc
result = len(list(filter(None, re.findall(r'\.', '#abc')))) > 0
print(f'元字符\\的使用:{result}')
re模块
写法
示例方法为match其他一样:re.match(r'字符或者元字符',文本)
python
from re import match,search,findall,finditer,sub,split,compile,fullmatch,escape
# re.match() re.match(正则表达式, 文本) 从字符串的起始位置匹配正则表达式,如果匹配成功返回匹配对象,否则返回None。
result = match(r'abc','abctest')
print(result)
# re.fullmatch() re.fullmatch(正则表达式, 文本) 如果整个字符串与正则表达式完全匹配,则返回匹配对象,否则返回None。跟match看 尤其上面之前测试过了
result = fullmatch(r'abc','abctest')
print(result)
# re.search() re.search(正则表达式, 文本) 扫描整个字符串,返回第一个匹配的对象,如果没有匹配则返回None。
result = search(r'e[a-z]*','hello')
print(result)
# re.findall() re.findall(正则表达式, 文本) 返回字符串中所有匹配的子串,返回一个列表。
result = findall(r'abc','abcabc')
print(result)
# re.finditer() re.finditer(正则表达式, 文本) 返回一个迭代器,包含所有匹配的对象。
result = finditer(r'a[a-z]c','abcabcabc')
print(result)
# re.sub() re.sub(正则表达式, 替换字符串, 文本) 替换字符串中所有匹配正则表达式的部分,返回替换后的字符串。
result = sub(r'acc','abb','acc123456')
print(result)
# re.split() re.split(正则表达式, 文本) 根据正则表达式分割字符串,返回一个列表。
result = split(r'acc','accabb')
print(result)
# re.compile() re.compile(正则表达式) 将正则表达式编译成一个正则表达式对象,可以重复使用。
result = compile(r'acc')
print(result)
# re.escape() re.escape(字符串) 对字符串中的特殊字符进行转义,使其可以安全地用作正则表达式。
result = escape('abc \n test')
print(result)
常用函数和方法
方法名 | 使用格式 | 描述 |
---|---|---|
re.match() |
re.match(正则表达式, 文本) |
从字符串的起始位置匹配正则表达式,如果匹配成功返回匹配对象,否则返回 None 。 |
re.search() |
re.search(正则表达式, 文本) |
扫描整个字符串,返回第一个匹配的对象,如果没有匹配则返回 None 。 |
re.findall() |
re.findall(正则表达式, 文本) |
返回字符串中所有匹配的子串,返回一个列表。 |
re.finditer() |
re.finditer(正则表达式, 文本) |
返回一个迭代器,包含所有匹配的对象。 |
re.sub() |
re.sub(正则表达式, 替换字符串, 文本) |
替换字符串中所有匹配正则表达式的部分,返回替换后的字符串。 |
re.split() |
re.split(正则表达式, 文本) |
根据正则表达式分割字符串,返回一个列表。 |
re.compile() |
re.compile(正则表达式) |
将正则表达式编译成一个正则表达式对象,可以重复使用。 |
re.fullmatch() |
re.fullmatch(正则表达式, 文本) |
如果整个字符串与正则表达式完全匹配,则返回匹配对象,否则返回 None 。 |
re.escape() |
re.escape(字符串) |
对字符串中的特殊字符进行转义,使其可以安全地用作正则表达式。 |
Python常用正则表达式
用户名验证:
匹配用户名(字母开头,允许字母、数字、下划线和点)
python
import re
# 正则表达式
pattern = r'^[a-zA-Z][a-zA-Z0-9_.]{3,15}$'
usernames = ["User123", "user_name", "123User", "us"]
for username in usernames:
if re.match(pattern, username):
print(f"{username} 是有效的用户名")
else:
print(f"{username} 是无效的用户名")
密码验证
-
长度通常在 8 到 20 个字符之间。
-
必须包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符(如
!@#$%^&*
)。 -
不能包含空格。
python
import re
def is_valid_password(password):
# 密码正则表达式
pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,20}$'
return re.match(pattern, password) is not None
手机格式验证
python
import re
def is_valid_phone_number(phone):
pattern = r'^1[3-9]\d{9}$' # 中国大陆手机号码格式
return re.match(pattern, phone) is not None
print(is_valid_phone_number('13800138000')) # 输出: True
print(is_valid_phone_number('12345678901')) # 输出: False
邮箱验证
python
import re
def is_valid_email(email):
# 正则表达式
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
return re.match(pattern, email) is not None
抓取地址
python
import re
def extract_urls(text):
pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'
return re.findall(pattern, text)
text = "Visit https://www.example.com or http://example.org for more info."
print(extract_urls(text)) # 输出: ['https://www.example.com', 'http://example.org']