掘金 后端 ( ) • 2024-04-06 16:24

theme: lilsnake

正则表达式简介

定义:

正则表达式(Regular Expression)是一种用于描述文本模式(pattern)的形式语言。它由字符和操作符构成,用于匹配、搜索和编辑文本。正则表达式可以用来在文本中查找特定模式的字符串,例如检查一个字符串是否符合特定的格式、提取字符串中的特定部分、替换文本中的指定内容等

主要的一些应用场景

  1. 文本搜索和替换:用于在文本中查找特定的模式或者替换特定的字符串。
  2. 数据验证:用于验证输入数据是否符合指定的格式,比如邮箱地址、电话号码、身份证号码等。
  3. 数据提取:用于从文本中提取特定的信息,比如从网页中提取链接、从日志中提取关键信息等。
  4. 数据处理:用于对文本进行分割、合并、格式化等操作。
  5. 编程语言中的模式匹配:许多编程语言都支持正则表达式,用于在程序中进行模式匹配和文本处理。

在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)