正则表达式简介
正则表达式简介
定义:
正则表达式(Regular Expression)是一种用于描述文本模式(pattern)的形式语言。它由字符和操作符构成,用于匹配、搜索和编辑文本。正则表达式可以用来在文本中查找特定模式的字符串,例如检查一个字符串是否符合特定的格式、提取字符串中的特定部分、替换文本中的指定内容等
主要的一些应用场景
- 文本搜索和替换:用于在文本中查找特定的模式或者替换特定的字符串。
- 数据验证:用于验证输入数据是否符合指定的格式,比如邮箱地址、电话号码、身份证号码等。
- 数据提取:用于从文本中提取特定的信息,比如从网页中提取链接、从日志中提取关键信息等。
- 数据处理:用于对文本进行分割、合并、格式化等操作。
- 编程语言中的模式匹配:许多编程语言都支持正则表达式,用于在程序中进行模式匹配和文本处理。
在python中使用正则表达式
常见的re模块函数
在python中我们通常需要去导入外部re模块的部分功能,如下:
函数 | 说明 |
---|---|
match() | 从一个字符串的开始位置起匹配正则表达式,返回Match对象 |
search() | 在一个字符串中搜索匹配正则表达式的第一个位置,返回Match对象 |
findall() | 搜索字符串,以列表类型返回全部能匹配的子串 |
compile() | 编译正则表达式,返回Pattern对象 |
split() | 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 |
sub() | 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 |
str1='hello world'
res=re.match('hell',str1) # match() 在起始位置匹配
res1=re.match('e',str1)
print(res)
print(res1)
res=re.search('l',str1) # search()只匹配一次
print(type(res))
res=re.findall('l',str1) # findall()返回一个列表 匹配所有符合规则的字符
print(res)
pattern = re.compile('a') # compile()用于编译正则表达式
data = pattern.search('123abc')
print(data)
data1=pattern.match('ass')
print(data1)
res=re.split('h','afhsshughduaih') # spilt()切割字符串 返回列表
print(res)
res=re.sub('l','909',str1,1) # 新字符 旧字符 替换的字符串 替换次数
print(res)
元字符的使用
元字符 | 匹配内容 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配所有普通字符(数字、字母或下划线) |
\s | 匹配任意的空白符:包括空格、制表符(Tab)、换行符、回车符等 |
\d | 匹配数字 |
\W | 匹配非字母或数字或下划线 |
\D | 匹配非数字 |
\S | 匹配非空白符 |
() | 正则表达式分组所用符号,匹配括号内的表达式,表示一个组。 |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中字符的所有字符 |
^ | 匹配字符串的开始位置,不匹配任何字符串 |
$ | 匹配字符串的结尾位置,不匹配任何字符串 |
a|b:匹配字符a或字符b
res=re.findall('\w','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\W','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\d','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\D','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\s','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\S','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('^\w','js_s1\tf4 ?6i\ng.joi1')
print(res) # 输出j
res=re.findall('\w$','js_s1\tf4 ?6i\ng.joi1')
print(res) # 输出1
res=re.findall('\w{2}','js_s1\tf4 ?6i\ng.joi1') # {m,n}精确范围数量
print(res) # 输出['js', '_s', 'f4', '6i', 'jo', 'i1']
res=re.findall('\w{2,5}','js_s1\tf4 ?6i\ng.joi1')
print(res) # 输出['js_s1', 'f4', '6i', 'joi1']
贪婪匹配和非贪婪匹配
贪婪匹配:在贪婪匹配模式下,量词会尽可能多地匹配文本。例如,*
和 +
是贪婪的,它们会尽可能多地匹配字符。例如,正则表达式 \w+
会尽可能多地匹配连续的字母数字字符和下划线,直到遇到非字母数字字符或字符串结束。
非贪婪匹配:在非贪婪匹配模式下,量词会尽可能少地匹配文本。为了将量词变为非贪婪的,可以在量词后面加上 ?
。例如,*?
和 +?
将匹配尽可能少的字符。非贪婪匹配适用于需要匹配最短可能字符串的情况,或者在量词后面紧跟一个其他匹配条件时。
#贪婪匹配
res=re.findall('\w{2,}','js_s1\tf4 ?6i\ng.joi1 9807655566') #{m,}范围最小到范围无限大
print(res)
res=re.findall('\w+','js_s1\tf4 ?6i\ng.joi1') # + 相当于 {1,}
print(res)
res=re.findall('\w*','js_s1\tf4 ?6i\ng.joi1') # * 相当于 {0,}
print(res)
#非贪婪匹配
res=re.findall('\w','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\w*?','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\w+?','js_s1\tf4 ?6i\ng.joi1')
print(res)
# 万能公式 .*? 的使用
url='https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0'}
response=requests.get(url,headers=headers).text
# print(response)
pat='<img class="" src="(.*?)"'
result=re.findall(pat,response)
print(result)
转载自:https://juejin.cn/post/7354040824999116809