正则表达式(一行胜千言)
正则表达式(Regular Expression)又称规则表达式,是计算机科学领域的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。以下介绍Python中Re库基本内容与使用方法:
- raw string和string类型
- 基本语法规则
- 主要功能函数
- match对象及其属性
- 修饰符
- 正则表达式应用案例
1.raw string和string类型
正则表达式有两种表示类型:raw string(原生字符串类型)和string类型。
raw string类型是不包含转义符 \ 的字符串,表示为r'text',例如r'[1-9]\d{5}'。
string类型是包含转义符的字符串,表示为'text',因此使用更加繁琐,在使用某些包含斜杠的元字符时需要增加转义符,例如:'[1-9]\\d{5}'。
2.基本语法规则
(1)元字符
匹配位置的元字符
^ | $ | \b |
---|---|---|
匹配开头 | 匹配结尾 | 匹配开头或结尾 |
“^abc”匹配以“abc”开头的字符串 | “abc$”匹配以“abc”结尾的字符串 | r“abc\b”匹配以“abc”开始或者结尾的单词 |
注:
“^abc$”匹配以“abc”开始和结尾的字符串。
\b不匹配空格、标点符号或换行符号。
匹配字符的元字符
. | \W | \s | \S | \d | \D |
---|---|---|---|---|---|
匹配除换行之外的任意字符 | 匹配单词字符 | 匹配任意非单词字符 | 匹配任意的空白字符 | 匹配任意的非空白字符 | 匹配任意的非数字字符 |
(2)字符类
字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。字符类可以在方括号“[]”中定义。
例如:[012345]可以匹配数字0到5中的任意一个;[0-9]等价于[0123456789],可匹配任何一个数字。
连字符“-”
如果要在字符类中包含连字符“-”,则必须包含在第一位,例如:[-a]表示表达式匹配-或者a。
否定字符“^”
如果^是字符类的第一个字符表示否定该字符串,也就是匹配该字符串外的任意字符。例如:[^abc]匹配除了abc以外的任意字符;
反/转义字符“\”
在查找元字符本身的时,例如,查找“.”或者“*”时,需要使用“\”转义符来取消这些字符的特殊意义。
限定符
字符 | 功能 |
---|---|
* | 零次或多次 |
+ | 一次或多次 |
? | 零次或一次 |
*? | 尽可能少的使用重复的第一个匹配 |
+? | 尽可能少的使用重复但至少使用一次 |
?? | 如果有可能使用零次重复或一次重复 |
{n} | 匹配确定的n次 |
{n,} | 至少匹配n次 |
{n,m} | 最少匹配n次且最多匹配m次 |
注:m和n均为非负整数
(3)懒惰匹配和贪婪匹配
原始字符串: PYANBNCNDN
懒惰匹配正则表达式: PY.?N
懒惰匹配结果: PYAN
贪婪匹配正则表达式: PY.N
贪婪匹配结果:PYANBNCNDN
(4)两种表达方式
图片来源:中国大学慕课《Python网络爬虫与信息提取》
3.主要功能函数
图片来源:中国大学慕课《Python网络爬虫与信息提取》
示例如下:
import re
#匹配第一个
match = re.search(r'[1-9]\d{5}','BIT 100081 TSU100084')
if match:
print("search:",match.group(0))
print(match.re)
search: 100081
import re
#re.match从首字母匹配第一个
match1 = re.match(r'[1-9]\d{5}','BIT 100081')
if match1:
print(match1.group(0))
match2 = re.match(r'[1-9]\d{5}','100081')
if match2:
print("match2:",match2.group(0))
match2: 100081
import re
#匹配所有
ls = re.findall(r'[1-9]\d{5}','BIT 100081 TSU100084')
print("ls:",ls)
ls: ['100081', '100084']
import re
#分割
print("split:",re.split(r'[1-9]\d{5}','BIT 100081 TSU100084'))
print("split_maxsplit=1:",re.split(r'[1-9]\d{5}','BIT 100081 TSU100084',maxsplit=1))
split: ['BIT ', ' TSU', '']
split_maxsplit=1: ['BIT ', ' TSU100084']
注:maxsplit可以指定分割次数
import re
#finditer
for m in re.finditer(r'[1-9]\d{5}','BIT 100081 TSU100084'):
if m:
print("finditer",m.group(0))
finditer 100081
finditer 100084
import re
sub替换正则表达式匹配的旧字符串
sub = re.sub(r'[1-9]\d{5}',':zipcode','BIT 100081 TSU100084')
print('sub:',sub)
sub: BIT :zipcode TSU:zipcode
4.match对象属性及方法
图片来源:中国大学慕课《Python网络爬虫与信息提取》
5.修饰符
图片来源:中国大学慕课《Python网络爬虫与信息提取》
6.正则表达式应用案例
电子邮箱匹配
#电子邮箱匹配
import re
pattern='[a-zA-Z0-9_-]+@+[a-z0-9A-Z]+\.(com|cn|net)'
email1='whuer123@123.com'
email2='小明123@123.com'
email3='whuer123@12'
result=re.match(pattern,email1)
if result:
print(email1, '匹配')
else:
print(email1, '不匹配')
result=re.match(pattern,email2)
if result:
print(email2, '匹配')
else:
print(email2, '不匹配')
result=re.match(pattern,email3)
if result:
print(email3, '匹配')
else:
print(email3, '不匹配')
whuer123@123.com 匹配
小明123@123.com 不匹配
whuer123@12 不匹配
网友评论