十分钟带你深入浅出正则表达式——从基础到进阶
正则表达式(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)!