正则表达式模块re及其应用

正则表达式是一种强大的文本处理工具,能够用来匹配、查找、替换复杂的文本模式。Python中的正则表达式由re模块提供。

以下是一些常用的方法及示例:

一. 常用方法

  1. re.match() 从头开始匹配
  2. re.search() 搜索第一个匹配串
  3. re.findall() 查找所有匹配项
  4. re.finditer() 遍历所有匹配
  5. re.sub() 替换字符串中匹配的模式
  6. re.split() 将字符串分割成列表
  7. re.compile() 编译正则表达式模式
python 复制代码
import re

# re.match() 从头开始匹配 \d+ 匹配数字 pattern = r'\d+'
print(re.match(r'\d+', '123abc').group()) # 123

# re.search() 搜索第一个匹配的模式
print(re.search(r'\d+', '123abc1232').group()) # 123

# re.findall() 返回字符串中所有匹配的结果
print(re.findall(r'\d+', '123abc1232')) # ['123', '1232']

# re.finditer() 遍历所有匹配
for result in re.finditer(r'\d+', '123abc1232'):
    print(result.group())
"""
123
1232
"""

# re.sub() 替换字符串中匹配的模式 替换数字为X
print(re.sub(r'\d+', 'X', 'abc123abc456')) # abcXabcX

# re.split() 将字符串分割成列表 以数字为分隔符进行字符串分割
print(re.split(r'\d+', 'abc123abc456')) # ['abc', 'abc', '']

# re.compile() 编译正则表达式模式
print(re.compile(r'\d+').search('123 apples and 456 oranges').group()) # 123

🥝 re.match()

python 复制代码
re.match(pattern, string, flags=0)
  • 尝试从字符串的起始位置匹配一个模式。
  • 如果匹配成功,则返回匹配的对象;否则返回None
python 复制代码
import re

pattern = r'\d+'  # 匹配数字
result = re.match(pattern, '123abc')
print(result.group())  # 输出:123
python 复制代码
import re

pattern = r'\d+'  # 匹配数字
result = re.match(pattern, 'z123abc')
print(result.group())  
# AttributeError: 'NoneType' object has no attribute 'group'

🥝 re.search()

  • 在字符串中搜索第一个匹配的模式。
  • 返回的是一个匹配对象,若没有找到则返回None
python 复制代码
import re

pattern = r'\d+'  # 匹配数字
result = re.search(pattern, 'abc123abc')
print(result.group())  # 输出:123
python 复制代码
import re

pattern = r'\d+'  # 匹配数字
result = re.search(pattern, 'abc')
print(result.group())  
# AttributeError: 'NoneType' object has no attribute 'group'
python 复制代码
import re

pattern = r'\d+'  # 匹配数字
result = re.search(pattern, 'abc1232a123')
print(result.group())  # 1232

🥝 re.findall()

  • 返回字符串中所有匹配的结果,结果以列表形式返回。
python 复制代码
import re

pattern = r'\d+'  # 匹配数字
result = re.findall(pattern, 'abc123abc456')
print(result)  # 输出:['123', '456']

🥝 re.finditer()

  • 返回一个迭代器,迭代器生成的是匹配对象,可以用来遍历所有匹配。
python 复制代码
import re

pattern = r'\d+'  # 匹配数字
result = re.finditer(pattern, 'abc123abc456')
for match in result:
    print(match.group())  
"""
输出:
123 
456
"""

🥝 re.sub()

  • 用于替换字符串中匹配的模式。
python 复制代码
import re

pattern = r'\d+'  # 匹配数字
result = re.sub(pattern, 'X', 'abc123abc456')
print(result)  # 输出:abcXabcX

🥝 re.split()

  • 根据匹配的模式将字符串分割成列表。
python 复制代码
import re

pattern = r'\d+'  # 匹配数字
result = re.split(pattern, 'abc123abc456')
print(result)  # 输出:['abc', 'abc', '']

🥝 re.compile()

  • 编译正则表达式模式,返回一个模式对象,可以使用这个模式对象进行更高效的匹配操作。

    python 复制代码
    import re
    
    pattern = r'\d+'  # 匹配数字
    result = re.compile(pattern).search('123 abc 456 abc')
    print(result.group())  # 123

二. 正则表达式模式

优先级:转义字符>括号>量词>字符类>断言>连接>管道符号

🥝 常用的模式 pattern

pattern description
[] 匹配方括号包围字符集合的任意一个字符
[^x] 匹配除了x以外的任意字符
[\u4e00-\u9fa5] 匹配中文汉字,汉字在 Unicode 的区间为此
[a-z] 匹配小写字母 a-z
[A-Z] 匹配大写字母 A-Z
[0-9] 匹配数字 0-9
[a-zA-Z0-9] 匹配字母和数字 a-z A-Z 0-9
[a-zA-Z0-9_] 匹配字母,数字和下划线 a-z A-Z 0-9 _
[A-Za-z0-9_] 匹配字母或数字或下划线 a-z A-Z 0-9 _
[^A-Za-z0-9_] 匹配任意非字母,数字,下划线的字符
[ \f\n\r\t\v] 匹配任意的空白符 空格
[^ \f\n\r\t\v] 匹配任意非空白符的字符
[0-9] 匹配数字
[^0-9] 匹配任意非数字的字符
^ 匹配字符串的开始 行开头,例如:^\d+数字开头
$ 匹配字符串的结束 行末,例如:\d+$数字结尾
` `
. 匹配除换行符以外的任意字符
\. 匹配点,例如小数点
\.? 匹配点,可以匹配0个或1个小数点

🥝 修饰符 flags

code description
I ignore - 不区分大小写
M multi line - 多行匹配
S 特殊字符圆点 . 中包含换行符 \n
ASCII 匹配 ASCII 字符
X 忽略空格和注释

三. 应用实例

1. 检验字符/字符串

检验邮箱是否有效

python 复制代码
# 检验邮箱是否有效
import re
#pattern = r"^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$"
pattern = r"^\w+@\w+\.[a-zA-Z]{2,}$"
# [a-zA-Z]{2,} 匹配前面的字符至少2次 {2,}, ∵邮箱的后缀最少有2个字,例如.cn
def val_email(email):
    if re.match(pattern, email):
        print("合法的邮件地址")
    else:
        print("无效的邮件地址")
val_email("[email protected]")  # 合法的邮件地址
val_email("testhotmail.com")     # 无效的邮件地址

常用字符串有效/无效检验正则表达式:

  • 邮箱正则表达式 ^\w+@\w+\.[a-zA-Z]{2,}
  • 手机号 ^(?:\+86)?1[3-9]\d{9}$
  • 网址 ^(https?://)?(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(/[a-zA-Z0-9#]+)*$
  • 微信号^[a-zA-Z][-_a-zA-Z0-9]{5,19}$
  • QQ号 ^[1-9][0-9]{4,10}$
  • 十六进制颜色 ^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$

更多字符/字符串校验👇

python 复制代码
import re
# 校验字符和字符串
# 1.校验邮箱
email_pattern = r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$'
emails = ["[email protected]", "invalid-email.com"]
for email in emails:
    if re.match(email_pattern, email):
        print(f"Valid email: {email}")
    else:
        print(f"Invalid email: {email}")

# 2.校验手机号
phone_pattern = r'^(?:\+86)?1[3-9]\d{9}$'
phones = ["13812345678", "1234567890", "+8613812345678"]
for phone in phones:
    if re.match(phone_pattern, phone):
        print(f"Valid phone number: {phone}")
    else:
        print(f"Invalid phone number: {phone}")

# 3.校验网址
url_pattern = r'^(https?://)?(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(/[a-zA-Z0-9#]+)*$'
urls = ["https://www.example.com", "http://example.com", "www.example.com", "invalid-url"]
for url in urls:
    if re.match(url_pattern, url):
        print(f"Valid URL: {url}")
    else:
        print(f"Invalid URL: {url}")

# 4.校验身份证
id_card_pattern = r'^\d{17}[\dX]$'
id_cards = ["12345678901234567X", "123456789012345678"]
for id_card in id_cards:
    if re.match(id_card_pattern, id_card):
        print(f"Valid ID card: {id_card}")
    else:
        print(f"Invalid ID card: {id_card}")
# 5.校验邮政编码(中国)
postal_code_pattern = r'^\d{6}$'
postal_codes = ["100000", "12345", "abcdef"]
for postal_code in postal_codes:
    if re.match(postal_code_pattern, postal_code):
        print(f"Valid postal code: {postal_code}")
    else:
        print(f"Invalid postal code: {postal_code}")

# 6.校验日期格式(YYYY-MM-DD)
date_pattern = r'^\d{4}-\d{2}-\d{2}$'
dates = ["2023-10-17", "2023-2-28", "20231017"]
for date in dates:
    if re.match(date_pattern, date):
        print(f"Valid date: {date}")
    else:
        print(f"Invalid date: {date}")

# 7.校验强密码(至少8个字符,包含字母、数字和特殊字符)
password_pattern = r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$'
passwords = ["A1b@cdef", "12345678", "password"]
for password in passwords:
    if re.match(password_pattern, password):
        print(f"Valid password: {password}")
    else:
        print(f"Invalid password: {password}")

# 8.校验车牌号
plate_pattern = r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$$'
passwords = ["京K39006", "12345678", "password"]
for password in passwords:
    if re.match(plate_pattern, password):
        print(f"Valid password: {password}")
    else:
        print(f"Invalid password: {password}")

2. 匹配字符/字符串

python 复制代码
import re
string = '<div style="display:none;">\n \
<script src="#" language="JavaScript"></script>\n\
<div class="info">\n\
<p>20test13.59sMy phone is 123-456-7890 and email is [email protected].</p>\n\
</div>\n</div>'

# 匹配字符串中的特定词 \b 边界匹配, 确保整个词而不是词的一部分被匹配
print(re.findall(r'\b' + re.escape("div") + r'\b', string, re.M))  # ['div', 'div', 'div', 'div']

# 忽略大小写 re.I ignore
print(re.search(r'\b\w*j\w*\b', string, flags=re.I|re.M).group()) # JavaScript

# 多行 re.M
print(re.findall(r'^<.*>$', string, re.M))
# ['<div style="display:none;">', '<div class="info">', '<p>test</p>', '</div>', '</div>']

# 或运算符 |
print(re.findall(r'style|class', string, re.M)) # ['style', 'class']

# 匹配数字(可含小数点)
print(re.findall(r'\d+\.?\d+', string, re.M))  # ['20', '13.59', '123', '456', '7890']

# 匹配电话号码
print(re.findall(r'\d{3}-\d{3}-\d{4}', string, re.M))  # ['123-456-7890']

# 匹配电子邮件地址
print(re.findall(r'[\w.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+', string, re.M))  # ['[email protected]']

3. 删除与替换

演示如何删除空行、查找并替换每行的"world"为"世界",以及删除特定的第3到第5行。

python 复制代码
import re

def process_text(text):
    # 1. 删除空行
    # 使用正则表达式匹配空行并替换为 ""
    text = re.sub(r'\n\s*\n', '\n', text)  # 删除连续空行
    text = re.sub(r'^\s*\n', '', text, flags=re.MULTILINE)  # 删除开头的空行

    # 2. 查找并替换每行中的 "world" 为 "世界"
    text = re.sub(r'world', '世界', text)

    # 3. 删除第3行到第5行
    lines = text.splitlines()
    # 选择第1行和第2行,以及第6行及之后的行
    lines = lines[:2] + lines[5:]

    # 将处理后的行合并为字符串
    return '\n'.join(lines)

# 示例文本
text = """Hello world!

This is a test.

world is beautiful.

Remember to explore the world.

Goodbye.
"""

# 处理文本
processed_text = process_text(text)

# 输出结果
print(processed_text)

"""
Hello 世界!

This is a test.

Goodbye.

"""

参考:

相关推荐
zm6 分钟前
极限复习c++
开发语言·c++
硅基茶水间10 分钟前
「轻量级AI编程桌面软件」代码上下文一键搞定|已开源
python
追风赶月、19 分钟前
【QT】认识QT
开发语言·qt
Hockor40 分钟前
写给前端的 Python 教程三(字符串驻留和小整数池)
前端·后端·python
网安小张42 分钟前
解锁FastAPI与MongoDB聚合管道的性能奥秘
数据库·python·django
GeekAGI43 分钟前
Python 定时器框架
python
秋田君1 小时前
深入理解JavaScript设计模式之闭包与高阶函数
开发语言·javascript·设计模式
KENYCHEN奉孝1 小时前
Pandas和Django的示例Demo
python·django·pandas
拾零吖1 小时前
《Pytorch深度学习实践》ch8-多分类
人工智能·pytorch·python
亿牛云爬虫专家1 小时前
NLP驱动网页数据分类与抽取实战
python·分类·爬虫代理·电商·代理ip·网页数据·www.goofish.com