Python学习第十三天

发布于:2025-03-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

正则表达式

        什么是正则表达式:简单来说就是通过特殊符号匹配想要的字符串,正则表达式本身就是基于字符串的一套搜索规则,掌握了正则表达式对于字符串有了更深的把握和理解。

概念

        官网概念:正则表达式(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] 匹配 ab 或 c
| 或的意思。|前后只要有满足条件的就可以作为结果返回。
() 分组,将多个字符作为一个整体进行匹配。
\ 转义字符,用于匹配元字符本身。例如 \. 匹配 .

大家一定要练练,顺道可以使用函数感受不同函数,最后在不断的优化和整理判断

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'字符或者元字符',文本)

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常用正则表达式

用户名验证:

        匹配用户名(字母开头,允许字母、数字、下划线和点)

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} 是无效的用户名")

密码验证

  1. 长度通常在 8 到 20 个字符之间。

  2. 必须包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符(如 !@#$%^&*)。

  3. 不能包含空格。

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

手机格式验证

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

邮箱验证

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

抓取地址

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']