# 元字符: # . ^ $ * + ? { } [ ] | ( ) \ # 字符类型匹配: # . 表示匹配任意一个字符(换行符除外) # [asdf] 表示匹配中括号里面的任意一个字母一次 # [a-z] 表示匹配a-z中的任意一个字母 [0-9] 表示匹配0-9中的任意一个数字 # [^0-9] 中括号中有^符号,表示非,除---之外,这里表示除0-9之外的任意字符 # \d 匹配数字,即 [0-9] # \D 匹配?数字,即不是数字 [^0-9] # \s 匹配空?,即 空格,tab键 [\t\n\r\f\v] # \S 匹配?空? [^\t\n\r\f\v] # \w 匹配单词字符,即a-z、A-Z、0-9、_ [a-zA-Z0-9_] # \W 匹配?单词字符 [^[a-zA-Z0-9_]] # \b 匹配一个特殊字符边界,比如 空格、&、# 等 # 定位: # ^ 表示起始定位 # $ 表示结束定位 # 匹配次数: # * 表示任意次 # + 至少1次 [1,+oo] # ? 匹配0次或者1次 # {a,b} 匹配指定的次数范围,如 {0,}相当于匹配任意次 ,{6} 表示匹配6次 # 分组 & 后向引用 & 别名: # (ab) 将括号中字符作为?个分组 # \num 引?分组num匹配到的字符串 # (?P<name>) 分组起别名 # (?P=name) 引?别名为name分组匹配到的字符 # | 匹配左右任意?个表达式
1)贪婪模式
import re # 导入re模块 # findall方法第一个参数是匹配的规则,第二个参数是要匹配的字符串 # findall会将所有匹配符合的内容保存到一个列表中 print(re.findall("hgzero", "thisishgzero")) # 输出:[hgzero]
data1 = re.findall("hg", "hgzerohgwzh") print(data1) # 输出:[‘hg‘, ‘hg‘]
2)惰性模式
data1 = re.findall("hg*", "hggggg") # 贪婪模式 data2 = re.findall("hg*?", "hggggg") # 惰性模式,后面的那个问号就表示惰性模式 print(data1) # 输出:[‘hggggg‘] print(data2) # 输出:[‘h‘]
字符串转义的流程:字符串 --> python解释器转义 --> re模块的转义
# 转义 ret1 = re.findall("www.baidu", "www.baidu") # 这里面的 . 会代指任意字符(除\n外) ret1 = re.findall("www\.baidu", "www.baidu") # 这里面,反斜杠的添加会让 . 符号失去元字符代指的意义,从而使其就表示普通的点 . 符号 # 字符串转义的流程: 字符串---> python解释器转义---> re模块的转义 ret2 = re.findall(r"I\b", "I hIo Ion") # 这里面的r ,表示在python层次不使用转义字符,直接将其传递给re模块 ret3 = re.findall("I\\\\b", "I hIo Ion") # 这里适用4个\ , 表示在python解释器层次转义成2个\ , 然后再将其传入re模块进行转义 re.findall("I\\b", "I what") # 这样使\\b在python层次被转义成\b传递给re模块 re.findall(r"I\b", "I what") # 这样在前面加上r ,可以让python不转义字符串内容,而直接传递给re
search会将匹配到的结果保存到一个对象中,且只匹配第一个对象。
用search取到的对象必须要用group取值。
# search会将匹配到的结果保存到一个对象中,且只匹配第一个对象 sear = re.search("\d+", "fasdfsaf345kdf89") # search返回的只是一个对象,且只返回找到的第一个 retu = sear.group() # 用search取到的对象必须要用group取值 # 可以用?P<name>的形式给某一部分命名别名 re.search("(?P<name>[a-z]+)(?P<age>\d+)", "hgzero21wzh23hg26").group("name") re.search("(?P<name>[a-z]+)(?P<age>\d+)", "hgzero21wzh23hg26").group("age")
match只从开始开始匹配,且只匹配一次,返回一个对象,若没匹配到则什么都不返回
# match只从开始开始匹配,且只匹配一次,返回一个对象,若没匹配到则什么都不返回 re.match("\d+", "234fda")
split会将字符串按照某字符分割,然后保存为一个列表
# split会将字符串按照某字符分割 re.split(" ", "hello abc what") # 将字符串按照空格分割,保存到一个列表中 re.split("[ |]", "hello welcome|hi hgzero") # 将字符串按照空格或者|进行分割后保存到一个列表中 re.split("[ab]", "abc") # 先按照a分割,左边形成一个空,然后将得到的bc再按照b分割,左边又得到一个空 # 打印结果为 [‘‘, ‘‘, ‘c‘]
sub可以完成字符串的替换功能
# sub可以完成字符串的替换功能 re.sub("\d+", "A", "welcome666hgzero987") # 将第三个参数中的字符串中的数字转换成A # 这里面的第四个参数可以限定匹配替换的次数 re.subn("\d", "A", "welcome666hgzero987")
# 将匹配到的内容放在一个元组里,结果中的第二个值为匹配替换的次数 # 打印结果为 (‘welcomeAAAhgzeroAAA‘, 6)
compile可以事先定义好规则,保存为一个对象,然后后面可以直接使用这个对象而无需再定义规则
# compile可以事先定义好规则,保存一个对象,然后后面可以直接使用这个对象而无需再定义规则 com = re.compile("\d+") com.findall("welcome666hgzero987")
finditer可以将得到的数据保存到一个迭代器中
# finditer可以将得到的数据保存到一个迭代器中 ret = re.finditer("\d", "welcome666hgzero987") next(ret).group() # 可以通过next函数加上group调用迭代器中的内容 re.findall("www\.(baidu|163)\.com", "www.baidu.com") # findall会优先将分组中的内容返回 # 这里的返回结果为 [‘baidu‘] re.findall("www\.(?:baidu|163)\.com", "www.baidu.com") # 【在分组中加上 ?: 可以去掉分组的优先级】
原文:https://www.cnblogs.com/hgzero/p/14125634.html