苏州公司企业网站建设,徐州经济开发区网站,做网站直播平台,国内做文玩的网站python正则表达式以及re模块
元字符
正则表达式的语法就由表格中的元字符组成#xff0c;一般用于搜索、替换、提取文本数据
元字符含义.匹配除换行符以外的任何单个字符*匹配前面的模式0次或1次匹配前面的模式1次或多次?匹配前面的模式0次或1次[]用于定义字符集#xff…python正则表达式以及re模块
元字符
正则表达式的语法就由表格中的元字符组成一般用于搜索、替换、提取文本数据
元字符含义.匹配除换行符以外的任何单个字符*匹配前面的模式0次或1次匹配前面的模式1次或多次?匹配前面的模式0次或1次[]用于定义字符集匹配方括号内的任何字符^匹配字符串的开头$匹配字符串的结尾\用于转义特殊字符使其失去特殊含义[^]匹配不在字符集中的任何字符|用于表示‘或’匹配两个或多个选择之一\d匹配任何数字字符\D匹配任何非数字字符\w匹配任何字母数字字符或下划线\W匹配任何非字母数字字符或下划线\s匹配任何空白字符\S匹配任何非空白字符
re模块
常用的re模块内置方法
re.方法名(表达式文本数据)
re.search(pattern, string)从字符串中搜索匹配给定模式的第一个出现并返回一个匹配对象。re.match(pattern, string)尝试从字符串的开头匹配给定模式如果成功匹配则返回一个匹配对象。re.findall(pattern, string)查找字符串中所有与给定模式匹配的非重叠部分并返回一个列表。re.sub(pattern, replacement, string)在字符串中查找与给定模式匹配的部分并用替换字符串替换它们。re.compile(pattern)将正则表达式模式编译为一个正则表达式对象以便进行复用和更高效的操作。
search()
从给定的字符串的开头开始搜索并在字符串中查找第一个与模式匹配的子字符串。它只返回第一个匹配的结果并且不会查找后续的匹配
import repattern rapple
string I have an apple and a banana
match re.search(pattern, string)
if match:print(type(match)) # class re.Matchprint(Found:, match.group()) # Found: appleprint(Start:, match.start()) # Start: 10print(End:, match.end()) # End: 15match()
与search()相似match()是从字符串的开头开始尝试匹配给定的正则表达式模式
import repattern rapple
string I have an apple and a banana
match re.match(pattern, string)
if match:print(Found:, match.group()) # Found: appleprint(Start:, match.start()) # Start: 10print(End:, match.end()) # End: 15
findall()
查找并返回字符串中与给定正则表达式模式匹配的所有非重叠子字符串
import repattern r\d
string There are 123 apples and 456 bananas
matches re.findall(pattern, string)
print(Matches:, matches) # 输出: Matches: [123, 456]
sub()
将搜索到的字符替换
import repattern rapple
string I have an apple and a banana
replacement orangenew_string re.sub(pattern, replacement, string)
print(new_string) # I have an orange and a bananacompile()
用于将正则表达式模式编译为一个可重复使用的正则表达式对象
import repattern r\d
string There are 123 apples and 456 bananasregex re.compile(pattern)
matches regex.findall(string)
print(matches) # [123, 456]分组模式
以下是用()分组的正则表达式模式
group()中的参数可以提取分组后的数据的索引但这个索引是从1开始的为空则返回全部
import remob re.compile(r(\86)(\d\d\d)(\d\d\d\d)(\d\d\d\d))
phone_number1 mob.search(我的电话号码是8618900043210)
print(电话号码 phone_number1.group()) # 电话号码8618900043210
print(前缀 phone_number1.group(1)) # 前缀86
print(前三位 phone_number1.group(2)) # 前三位189
print(中四位 phone_number1.group(3)) # 中四位0004
print(后四位 phone_number1.group(4)) # 后四位3210贪婪匹配与非贪婪匹配
默认情况下正则表达式使用贪婪匹配。它会尽可能多地匹配字符。
在贪婪模式下量词后面没有添加?时它会匹配尽可能长的字符串。非贪婪模式则反之
例如对于正则表达式 a.*b 和字符串 aabab贪婪匹配将匹配整个字符串 aabab而非贪婪模式仅仅是第一个 aab。
import re# 贪婪匹配示例
pattern1 ra.*b
pattern2 ra.*?bstring aabab
match1 re.search(pattern1, string)
match2 re.search(pattern2, string)print(f贪婪模式{match1.group()}) # 贪婪模式aabab
print(f非贪婪模式{match2.group()}) # 非贪婪模式aab^和$
^表示匹配字符串的开头。当 ^ 放置在正则表达式的开头时它表示要匹配的内容必须出现在字符串的开头位置
import repattern r^(aaa)(\d)
regex re.compile(pattern)
match1 regex.search(aaa666这是信息的格式)
match2 regex.search(信息的格式是aaa666)
print(match1.group()) # aaa666
print(type(match2)) # class NoneType可以看到当开头不存在^所匹配的字符串时就会采不到数据
同理$就是表示匹配字符串的结尾它可以用来检查一个字符串是否以特定的模式结束
import repattern r(aaa)(\d)$
regex re.compile(pattern)
match1 regex.search(aaa666这是信息的格式)
match2 regex.search(信息的格式是aaa666)
print(type(match1)) # class NoneType
print(match2.group()) # aaa666多行模式Multiline Mode
在大部分爬虫案例中我们需要处理包含换行符的文本(当然现在爬虫也不咋用正则了~)这时就会用到多行模式(Multiline Mode)
import repattern2 r^abc$
string2 abc\n123\nabc
matches2 re.findall(pattern2, string2, re.MULTILINE)
print(matches2) # [abc, abc](?P)
(?P…) 是正则表达式中的一个语法构造用于给一个子模式子表达式命名以便在匹配结果中可以通过名称来引用
import repattern r(?Pyear\d{4})-(?Pmonth\d{2})-(?Pday\d{2})
text Todays date is 2022-09-30.match re.search(pattern, text)
if match:year match.group(year)month match.group(month)day match.group(day)print(fYear: {year}, Month: {month}, Day: {day})