什么是re正则表达式?
正则表达式(Regular Expression,简称为 RegExp 或者 RE)是一种用于匹配字符串的强大工具。它是由普通字符(例如字母、数字)和元字符(特殊字符)组成的字符串,用于描述字符串的特征模式。
正则表达式可以用来进行文本搜索和文本替换,以及数据验证等任务。它在计算机科学领域有着广泛的应用,如文本处理、网络爬虫、数据提取、数据清洗等。
在 Python 中,正则表达式模块是 re 模块,通过该模块可以使用各种函数来操作正则表达式,比如搜索、匹配、替换等。
正则表达式由两部分组成:
- 普通字符:表示字符串中的字符,如字母、数字等。
- 元字符:具有特殊含义的字符,用于描述字符串的模式,如通配符、量词等。
例如,
^
表示字符串的开始,$
表示字符串的结束,.
表示任意单个字符,*
表示前一个字符重复零次或多次,\d
表示数字等。通过组合普通字符和元字符,可以构建出复杂的模式,用来匹配符合特定条件的字符串。
如何在python中使用re正则表达式 ?
正则表达式是python中自带的库,不需要进行下载,可以直接导入使用,import re
re中基础匹配字符或字符串的语句
匹配单个字符
import re
# 匹配字符串开头是否为 'h',如果是则匹配成功
text001 = "hello"
a = re.match('h', text001)
print(a.group()) # 输出: h
# 匹配任意一个字符
text002 = "hello"
a = re.match('.', text002)
print(a.group()) # 输出: h
# 匹配一个数字字符
text003 = "11111"
a = re.match(r'\d', text003)
print(a.group()) # 输出: 1
# 匹配一个非数字字符
text004 = "+hello"
a = re.match(r'\D', text004)
print(a.group()) # 输出: +
# 匹配一个空白字符
text005 = " hello"
a = re.match(r'\s', text005)
print(a.group()) # 输出: (空格)
# 匹配一个字母、数字或下划线
text006 = "_hello"
a = re.match(r'\w', text006)
print(a.group()) # 输出: _
# 匹配一个非字母、数字或下划线字符
text007 = "+hello"
a = re.match(r'\W', text007)
print(a.group()) # 输出: +
re.match(pattern, string, flags=0)
:从字符串的起始位置开始匹配正则表达式
匹配多个字符
import re
# 匹配数字或减号的一个或多个实例
text008 = "0731-888888"
a = re.match(r'[\d\-]+', text008)
print(a.group()) # 输出: 0731-888888
# 匹配数字的一个或多个实例
text009 = "0731-888888"
a = re.match(r'[0-9]+', text009)
print(a.group()) # 输出: 0731
# 匹配小写字母、大写字母或数字的一个或多个实例
text010 = "ask23dl46EFWF78a547W"
a = re.match(r'[a-z,A-Z,0-9]+', text010)
print(a.group()) # 输出: ask23dl46EFWF78a547W
# 匹配数字的零个或多个实例
text011 = "0731-888888"
a = re.match(r'\d*', text011)
print(a.group()) # 输出: 0731
# 匹配一个或多个字母、数字或下划线
text012 = "qwertttyu"
b = re.match(r'\w+', text012)
print(b.group()) # 输出: qwertttyu
# 匹配正好三个字母、数字或下划线
text013 = "abcd"
c = re.match(r'\w{3}', text013)
print(c.group()) # 输出: abc
# 匹配一个到八个字母、数字或下划线
text014 = "abcdefghijklmnop"
d = re.match(r'\w{1,8}', text014)
print(d.group()) # 输出: abcdefgh
基础案例一
import re
# 验证手机号码的正则表达式
text015 = "15110631111"
ret01 = re.match(r'1[3589]\d{9}', text015)
print(ret01.group()) # 输出: 15110631111
# 验证邮箱的正则表达式
text016 = "3200182199@qq.com"
ret02 = re.match(r'\w+@[a-z0-9]+\.[a-z]+', text016)
print(ret02.group()) # 输出: 3200182199@qq.com
# 验证URL的正则表达式
text017 = "https://movie.douban.com/j/search_subjects"
ret03 = re.match(r'(http|https|ftp)://[^\s]+', text017)
print(ret03.group()) # 输出: https://movie.douban.com/j/search_subjects
# 验证身份证的正则表达式
text018 = "1628493720856361x"
ret04 = re.match(r'\d{16}[\w]', text018)
print(ret04.group()) # 输出: 1628493720856361x
贪婪模式与非贪婪模式 :
# 匹配一个或多个数字(贪婪模式)
text019 = "123456789"
ret05 = re.match(r'\d+', text019)
print(ret05.group()) # 输出: 123456789
# 匹配一个或多个数字(非贪婪模式)
text020 = "123456789"
ret06 = re.match(r'\d+?', text020)
print(ret06.group()) # 输出: 1
# 匹配尖括号中的内容,使用非贪婪模式
text021 = "<h1>标题<h1>"
ret07 = re.match(r'<.+?>', text021)
print(ret07.group()) # 输出: <h1>
这个正则表达式
<.+?>
用于匹配最短的以<
开始、以>
结束的字符串,即非贪婪匹配。在这里,它会匹配<h1>
。在正则表达式中,
?
是一个量词修饰符,用于指定前面的匹配模式为非贪婪(或最小匹配)。通常情况下,正则表达式会尽可能多地匹配目标字符串,这被称为贪婪匹配。但当在量词后面添加?
时,它会使匹配变得非贪婪,即尽可能少地匹配目标字符串。例如,在正则表达式
<.+?>
中,.
匹配任意字符,+
表示匹配一个或多个前面的字符(.
),而?
则表示将+
量词变为非贪婪模式。这样,正则表达式会尽可能少地匹配目标字符串,直到找到第一个>
结束标记。
基础案例二
转义字符和原生字符
# 转义字符和原生字符串
text023 = "apple price is $399"
ret09 = re.search(r'\$\d+', text023)
print(ret09.group()) # 输出: $399
text024 = "\\n" # text024 = r"\n"
print(text024) # 输出: \n
ret10 = re.search(r'\\n', text024)
print(ret10.group()) # 输出: \n
re函数模块:
分组:
import re
text025 = "apple price is $399 and orange price is $299"
ret10 = re.search(r'.*(\$\d+).*?(\$\d+)', text025)
print(ret10.group(1)) # 第一个价格 输出: $399
print(ret10.group(2)) # 第二个价格 输出: $299
re.search(pattern, string, flags=0)
:在字符串中搜索匹配正则表达式的第一个位置,并返回匹配对象
在正则表达式中,美元符号
$
有两种不同的含义:
在正则表达式中,美元符号
$
表示匹配字符串的结尾。例如,正则表达式^\d+$
将匹配由数字组成的字符串,^
表示字符串的开头,\d+
表示一个或多个数字,而$
表示字符串的结尾。美元符号
$
也可以用作一个普通字符,表示字符串中的美元符号。在正则表达式中,为了匹配$
字符本身,需要使用转义字符\
,即\
。因此,\$
将匹配字符串中的$
符号.
findall函数:
import re
text026 = "apple price is $399 and orange price is $299"
re11 = re.findall(r'\$\d+',text026)
print(re11) # 输出:['$399', '$299']
re.findall(pattern, string, flags=0)
:在字符串中查找正则表达式匹配的所有子串,并返回一个包含所有匹配结果的列表。
sub函数:
import re
text027 = "apple price is $399 and orange price is $299"
re12 = re.sub(r'\$\d+',"0",text027)
print(re12) # 输出:apple price is 0 and orange price is 0
re.sub(pattern, repl, string, count=0, flags=0)
:用指定的字符串替换匹配正则表达式的子串,并返回替换后的字符串。
splist函数 :
import re
text028 = "hello world ni hao"
ret13 = re.split(r' ',text028)
print(ret13) # 输出: ['hello', 'world', 'ni', 'hao']
re.split(pattern, string, maxsplit=0, flags=0)
:根据正则表达式匹配的模式将字符串分割成列表,并返回列表。