自学内容网 自学内容网

十分钟带你深入浅出正则表达式——从基础到进阶

正则表达式(Regular expressions,也叫 REs、 regexs 或 regex patterns),本质上是嵌入 Python 内部并通过re模块提供的一种微小的、高度专业化的编程语言。

正则常用功能:

1、可以为想要匹配的可能字符串编写规则。这些字符串可能是英文句子、邮箱地址、TeX 命令或任何你喜欢的内容。

2、可以提出诸如“此字符串是否与表达式匹配?”、“字符串中是否存在表达式的匹配项?”之类的问题。

3、可以用正则来修改字符串,或以各种方式将其拆分。

正则的优点: 速度快, 效率⾼, 准确性⾼。

正则的缺点: 新⼿上⼿难度有点⼉⾼。


一、正则表达式简介

正则表达式是一种用来匹配字符串模式的表达式。它通过使用特殊的符号和字符组合,定义了一套匹配规则。我们抓取到的⽹⻚源代码本质上就是⼀个超⻓的字符串, 想从⾥⾯提取内容。⽤正则再合适不过了

元字符: 具有固定含义的特殊符号

常⽤元字符:

  • . 匹配任意字符
  • \w 匹配字母或数字或下划线
  • \d 匹配数字
  • \s 匹配空白字符
  • \n 匹配换行符
  • \t 匹配制表符
  • \W 匹配非字母或数字或下划线
  • \D 匹配非数字
  • \S 匹配非空白字符
  • \b 匹配单词边界
  • \B 匹配非单词边界
  • ^ 匹配字符串的开头
  • $ 匹配字符串的末尾
  • a|b 匹配a或b
  • [] 字符集,匹配括号内的任意字符
  • [^] 匹配不在括号内的任意字符
  • (xyz) 特征标群,用于匹配与括号内的字符完全相同的字符串
  • \ 转义字符,用于匹配特殊字符,如[]、()、.等
# 示例:
import re

text = "The price of the product is $19.99, tHe quantity is 10."

#匹配任意字符
any_char = re.findall(r'.', text) 
print(any_char) #输出:['T', 'h', 'e','', 'p', 'r', 'i', 'c', 'e','', 'o', 'f','', 't', 'h', 'e','', 'p', 'r', 'o', 'd', 'u', 'c', 't','', 'i','s','', '$', '1', '9', '.', '9', '9', ',','', 't', 'H', 'e','', 'q', 'u', 'a', 'n', 't', 'i', 't', 'y','', 'i','s','', '1', '0', '.']

#匹配数字
numbers = re.findall(r'\d', text) #findall()函数返回所有匹配的数字组成的列表
print(numbers)  #输出:['1', '9', '1', '0']

# 匹配所有字母
letters = re.findall(r'[a-zA-Z]', text) 
print(letters) #输出:['T', 'h', 'e','', 'p', 'r', 'i', 'c', 'e','', 'o', 'f','', 't', 'h', 'e','', 'p', 'r', 'o', 'd', 'u', 'c', 't','', 'i','s','', '$', '1', '9', '.', '9', '9', ',','', 't', 'H', 'e','', 'q', 'u', 'a', 'n', 't', 'i', 't', 'y','', 'i','s','', '1', '0', '.']

# 匹配所有数字和字母
numbers_and_letters = re.findall(r'\w', text) 
print(numbers_and_letters)  #输出:['T', 'h', 'e','', 'p', 'r', 'i', 'c', 'e','', 'o', 'f','', 't', 'h', 'e','', 'p', 'r', 'o', 'd', 'u', 'c', 't','', 'i','s','', '$', '1', '9', '.', '9', '9', ',','', 't', 'H', 'e','', 'q', 'u', 'a', 'n', 't', 'i', 't', 'y','', 'i','s','', '1', '0', '.']

#匹配$符号
dollars = re.findall(r'\$', text) 
print(dollars)  #输出:['$']

#只匹配the字符集
the_char = re.findall(r'the', text) 
print(the_char)  #输出:['the']

#匹配the字符集,不区分大小写
the_char_ignore_case = re.findall(r'the', text, re.I) #re.I表示忽略大小写,re.IGNORECASE也可以
print(the_char_ignore_case)  #输出:['the', 'The', 'tHe']

#匹配the或者The字符集
the_or_The_char = re.findall(r'the|The', text) 
print(the_or_The_char)  #输出:['the', 'The']

量词: 控制前⾯的元字符出现的次数

  • * 匹配前面的字符出现0次或无限次
  • + 匹配前面的字符出现1次或无限次
  • ? 匹配前面的字符出现0次或1次
  • {n} 匹配前面的字符出现n次
  • {n,m} 匹配前面的字符出现n到m次
  • {,m} 匹配前面的字符出现0到m次
  • {n,} 匹配前面的字符出现n次或无限次
#示例:
import re
text = "The price of the product is $19.9997, tHe quantity is 103."
#匹配所有的数字
pattern = r'\d+'
result = re.findall(pattern, text)
print(result) #['19', '9997', '103']

#匹配所有的字母
pattern = r'[a-zA-Z]+'
result = re.findall(pattern, text)
print(result) #['The', 'price', 'of', 'the', 'product', 'is', 'tHe', 'quantity', 'is']

#匹配所有的数字和字母
pattern = r'\w+'
result = re.findall(pattern, text)
print(result) #['The', 'price', 'of', 'the', 'product', 'is', '19', '9997', 'tHe', 'quantity', 'is', '103']

#匹配0个或多个数字
pattern = r'\d*' 
result = re.findall(pattern, text)
print(result) #['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '19', '', '9997', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '103', '', '']

#匹配2到3位数字
pattern = r'[0-9]{2,3}'
result = re.findall(pattern, text)
print(result) #['19', '999', '103']

#匹配3位及以上数字
pattern = r'\d{3,}'
result = re.findall(pattern, text)
print(result) #['99997', '103']

#匹配以字符t开头的单词
pattern = r'^t\w+' 
result = re.findall(pattern, text) 
print(result) #[]

#匹配以字符t结尾的单词
pattern = r'\w+t$'
result = re.findall(pattern, text)
print(result) #[]

#匹配以字符t开头和结尾的单词
pattern = r'^t\w+t$'
result = re.findall(pattern, text)
print(result) #[]

这些符号可以组合使用,形成复杂的匹配规则。


二、Python中使用正则表达式

Python的re模块提供了一系列函数来使用正则表达式。以下是一些常用函数:

1. re.match(pattern, string, flags=0)

re.match()用于从字符串的开始位置匹配正则表达式,如果匹配成功,则返回一个匹配对象;否则返回None

import re

pattern = r"\d{3}-\d{4}-\d{4}"
text = "123-4567-8910"
match = re.match(pattern, text)

if match:
    print("匹配成功")
else:
    print("匹配失败")

案例解读:此代码匹配一个电话号码格式的字符串,如123-4567-8910。正则表达式r"\d{3}-\d{4}-\d{4}"定义了3个数字、一个-、4个数字、再一个-、最后是4个数字。

2. re.search(pattern, string, flags=0)

re.search()用于在整个字符串中搜索第一个匹配项,即使匹配项不在字符串的开始位置。

pattern = r"\d{3}-\d{4}-\d{4}"
text = "我的号码是123-4567-8910"
match = re.search(pattern, text)

if match:
    print("找到匹配:", match.group())
else:
    print("未找到匹配")

案例解读re.search()会在整个字符串中搜索电话号码,找到后返回匹配对象,match.group()返回匹配的字符串。

3. re.findall(pattern, string, flags=0)

re.findall()返回所有匹配的字符串,对 string 的扫描从左至右,匹配结果按照找到的顺序返回。 空匹配也包括在结果中,以列表形式返回。

pattern = r"\d+"
text = "有两个数字:123和456"
matches = re.findall(pattern, text)
print(matches)

案例解读re.findall()会找到所有的数字,输出结果为['123', '456']

4. re.sub(pattern, repl, string, count=0, flags=0)

re.sub()返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。

pattern = r"\d+"
text = "价格是100元,折扣后是80元"
new_text = re.sub(pattern, "X", text)
print(new_text)

案例解读:该正则表达式将字符串中的所有数字替换为X,输出结果为"价格是X元,折扣后是X元"


三、正则表达式进阶

正则表达式不仅可以用于简单的模式匹配,还可以通过分组、断言等方式,处理更复杂的文本。

1. 分组(Groups)

使用括号()可以创建捕获组,匹配的内容可以通过group()方法获取。

pattern = r"(\d{3})-(\d{4})-(\d{4})"
text = "123-4567-8910"
match = re.search(pattern, text)

if match:
    print("区号:", match.group(1))
    print("前半部分:", match.group(2))
    print("后半部分:", match.group(3))

案例解读:通过分组,可以分别提取电话号码的各个部分。

2. 贪婪匹配和惰性匹配

1、贪婪匹配: 正则表达式默认是贪婪匹配,即尽可能多的匹配字符。

  • .*:匹配任意字符,尽可能多的匹配字符(贪婪匹配)。

2、惰性匹配: 在正则表达式中,使用问号?表示该字符为非贪婪匹配,即尽可能少的匹配字符。

  • .*?:匹配任意字符,但尽可能少的匹配字符(惰性匹配)。

默认情况下,正则表达式是贪婪的,尽可能多地匹配字符。通过在量词后面加?可以实现非贪婪匹配。

pattern = r"<.*?>"
text = "<div>内容</div>"
match = re.search(pattern, text)
print(match.group())

案例解读:贪婪匹配<.*>会匹配整个字符串,而<.*?>只匹配到第一个<div>

3. 前后向断言(Lookahead 和 Lookbehind)

断言用于检查匹配字符的前后是否满足某种条件。

  • 前向断言(?=...),检查后面的内容是否满足。
  • 后向断言(?<=...),检查前面的内容是否满足。
# 匹配后面是空格的单词
pattern = r"\w+(?=\s)"
text = "Hello world!"
matches = re.findall(pattern, text)
print(matches)

案例解读:该正则表达式会找到Hello,因为它后面跟着一个空格。


四、实际应用案例

1. 邮箱验证

正则表达式常用于验证邮箱地址的格式。

pattern = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"
email = "example@mail.com"
if re.match(pattern, email):
    print("邮箱格式正确")
else:
    print("邮箱格式不正确")
2. 提取网址中的域名

使用正则表达式从URL中提取域名。

pattern = r"https?://(www\.)?([^/]+)"
url = "https://www.example.com/path"
match = re.search(pattern, url)
if match:
    print("域名:", match.group(2))

五、总结

正则表达式作为处理字符串的强大工具,在Python的re模块中提供了强大的功能。通过掌握正则表达式的基本符号和高级用法,可以轻松处理复杂的文本匹配需求。希望本文通过详细的讲解和实际案例,帮助你更好地理解和运用正则表达式。

如果你对正则表达式感兴趣,不妨在代码中(regex101平台)多加练习,真正掌握这项高效的工具!
在这里插入图片描述


推荐阅读

欢迎在评论区分享你在使用正则表达式时遇到的问题和经验!
欢迎大家关注微信公众号(AI智数课堂),共同进步!
在这里插入图片描述


原文地址:https://blog.csdn.net/sinat_36192944/article/details/142483099

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!