suguangti
re.findall  匹配到正则表达式的字符,匹配到的每个字符存入一个列表,返回一个匹配到的所有字符列表
一. 匹配单个字符
import re
# \w 匹配所有字母、数字、下划线
re.findall(\'\w\',\'abcd_123    *-\')
# 结果为:[\'a\', \'b\', \'c\', \'d\', \'_\', \'1\', \'2\', \'3\']


# \s 匹配所有不可见字符
#  不可见字符有:\n \t 空格
re.findall(\'\s\',\'abcd \n\tdf21  \')
# 结果为:[\' \', \'\n\', \'\t\', \' \', \' \']


# \d 匹配所有数字
re.findall(\'\d\',\'a1bc3 4d \n\tdf21  \')
# 结果为:[\'1\', \'3\', \'4\', \'2\', \'1\']


# . 匹配\n换行符以外的所有可见和不可见字符
re.findall(\'.\', \'c3 d\n\td1\')
# 结果为:[\'c\', \'3\', \' \', \'d\', \'\t\', \'d\', \'1\']
二. 匹配多个字符
#匹配多个字符:* + ?
import re
#  * 匹配0或n次
re.findall(\'\d*\', \'1a23\')
# 结果为:[\'1\', \'\', \'23\', \'\']


#  + 匹配1或n次
re.findall(\'\d+\', \'1a23\')
# 结果为:[\'1\', \'23\']
#前面2个是叫贪婪匹配


#  ? 匹配0或1次
re.findall(\'\d?\', \'1a3\')
# 结果为:[\'1\', \'\', \'3\', \'\']
# 这个叫非贪婪匹配
三. 匹配指定范围字符
# {m,n} 匹配最少m次,最多n次
# {m} 只匹配m次的
# {,n}  匹配最大n次,最小次数不限
# {m,}  匹配最小m次,最大次数不限
re.findall(\'\d{2,4}\', \'1a33g134nn12345\')
# 结果为:[\'33\', \'134\', \'1234\']
re.findall(\'a{3}\', \'1aaa3*G+1aaaan#b\')
# 结果为:[\'aaa\', \'aaa\']


# | 匹配 或 语法的字符
re.findall(\'1|23|4\', \'1a33g134nn12345\')
# 结果为:[\'1\', \'1\', \'4\', \'1\', \'23\', \'4\']


# [ ] 匹配括号内的字符(只匹配单个)
re.findall(\'[123]\', \'1a33g134nn12345\')
# 结果为:[\'1\', \'3\', \'3\', \'1\', \'3\', \'1\', \'2\', \'3\']
re.findall(\'[0-9a-zA-Z]\', \'1a3*G+1n#\')
# 匹配0到9或者a到z或者A到Z单个字符
# 结果为:[\'1\', \'a\', \'3\', \'G\', \'1\', \'n\']


# ^x 行首匹配
# x$ 行尾匹配
re.findall(\'^1\', \'1a3*G+1n#b\')
re.findall(\'b$\', \'1a3*G+1n#b\')
# 结果为:[\'1\']     
# 结果为:[\'b\']
四. 一些比较不常见的匹配
\b 单词边界,重点理解在于‘边界’二字,‘单词’代表匹配的字符串

  划定边界基本原则:比如表达式为 \'\b单词\b\'   的意思就是匹配字符串为‘单词’,单词两边需要存在满足条件的边界才能匹配成功。匹配失败结果肯定是空列表,匹配成功结果就是匹配的单词字符串列表。

  \b在哪边就限制哪边的匹配。

  匹配成功的边界满足条件跟匹配单词字符串有关联,双方是同一类型则失败,不同类型则成功

# 正则表达式中的\b可以用匹配目标单词字符串,加设限制匹配边界
# 单词的 前边界:\'\b单词\'
#     后边界:\'单词\b\'
#     前和后边界:\'\b单词\b\'
# 在\b的使用中有这样几点是需要格外注意的
# 0. \b本身的含义就有转义字符串的作用,要用字符边界就得将其原始含义去掉,所以需要加r或者\\b(两个不能一起用)

# 1. 单词字符串能否匹配成功是有规律的:
# 如果是a-z,A-Z,0-9,则匹配边界为非字母数字才能匹配成功。
# 如果是非字母数字,则匹配边界为a-z,A-Z,0-9才能匹配成功。
# 如果是两个混在一起,判断标准为那个挨着\b最近的字符作为判断标准,如果是字母数字,则匹配边界为非字母数字才成功,反之亦然。
import re
s=\'aa abcperty/-aa \'
res1=re.findall(r\'\babc\',s)    # 结果:[\'abc\'] 单词为字母,左匹配边界为非字母数字,匹配成功
res2=re.findall(r\'abc\b\',s)    # 结果:[]      单词为字母,右匹配边界为字母,匹配失败
print(res1,res2)

s=\'aa@# perty/-aa \'
res3=re.findall(r\'\b@#\',s)     # 结果:[\'@#\']  单词为非字母数字,左匹配边界为字母,匹配成功
res4=re.findall(r\'@#\b\',s)     # 结果:[]      单词为非字母数字,右匹配边界为空格(非字母数字),匹配失败
print(res3,res4)

s=\'aa@a perty/-aa \'
res5=re.findall(r\'\b@a\',s)     # 结果:[\'@a\']  单词为混合,@挨着\b,单词以非字母数字为标准,左匹配边界为字母,匹配成功
res6=re.findall(r\'@a\b\',s)     # 结果:[\'@a\']  单词为混合,a挨着\b,单词以字母数字为标准,右匹配边界为空格,匹配成功
print(res5,res6)

# 2.字符串的首尾边界默认定义为 非字母数字,所以如果匹配的单词字符串在首尾,则匹配字母数字则会成功,匹配非字母数字失败。
s= \'abcd@\'
res7 = re.findall(r\'\ba\',s)    # 结果:[\'a\'] 单词为字母,左匹配边界为首,默认定义为非字母数字,匹配成功
res8 = re.findall(r\'@\b\',s)    # 结果:[] 单词为非字母数字,右匹配边界为尾,默认定义为非字母数字,匹配失败
print(res7,res8)
五. 分组

用小括号表示,分组后的正则表达式优先匹配并返回括号内的值

 

六. re模块常用方法
re.search   

查找,匹配成功返回第一匹配的字符串,结果为封装的对象(注意search返回的是个对象,.group() 后得到的是字符串不是列表),失败返回None

import re
s = \'welcome world hello python\'
res = re.search(\'hello\', s)
print(res)
print(res.group())

# 结果:
<_sre.SRE_Match object; span=(14, 19), match=\'hello\'>
hello
re.match

匹配,在行首匹配字符串,方法同search,区别在于,match在行首匹配,search是从前到后全部查找匹配。

s = \'hello welcome world hello python\'
res=re.match(\'hello\', s)
print(res)
print(res.group())
res1=re.match(\'welcome\',s)
print(res1)

# 结果:
<_sre.SRE_Match object; span=(0, 5), match=\'hello\'>
hello
None
re.split 

用匹配成功的字符串作为切割符,进行原字符串的切割,返回一个切割后的列表。匹配失败,直接返回原字符串,不做任何切割处理

匹配成功完成切割
s1 = \'hello welchhome world hello python\'
res=re.split(\'h.+?o\',s1)
print(res)

# 结果:
[\'\', \' welc\', \'me world \', \' python\']

匹配不成功,返回原字符串。不做任何切割处理
s1 = \'hello welchhome world hello python\'
res0=re.findall(\'json\',s1)
print(res0)
res=re.split(\'json\',s1)
print(res)

# 结果:
[]
[\'hello welchhome world hello python\']
 re.compile

将正则表达式封装成对象,用于重复使用该表达式。使用方法看例子:

s1 = \'hello welchhome world hello python\'
pat=re.compile(\'h.+?o\')
res2=pat.findall(s1)
print(res2)

# 结果:
[\'hello\', \'hho\', \'hello\']
re.sub

替换,重组(group(1)、group(2)...group(n)用\1  \2  ...\n来替换,进行字符串的重新组合(前面要加r防止其转义)

s=\'<我的博客地址https://www.cnblogs.com/oldboy2019/,欢迎大家来访问、交流,欢迎大家一起探讨python!ohye!>\'
# pat=re.compile(r\'<(.+)http://(www.+/),.+>\')
pat=re.compile(r\'<(.+)http.+(www.+/),(.+?)([a-z]+)!(.+)!>\')
print(pat.findall(s))
res=pat.sub(r\'\2\n这是\1,\4,\5\3\',s)
print(res)

# 结果:
[(\'我的博客地址\', \'www.cnblogs.com/oldboy2019/\', \'欢迎大家来访问、交流,欢迎大家一起探讨\', \'python\', \'ohye\')]
www.cnblogs.com/oldboy2019/
这是我的博客地址,python,ohye欢迎大家来访问、交流,欢迎大家一起探讨

#注意,这里第二个打印我在前面加了个原义字符r,但是里面\n还是转义成了换行,很奇怪,这个地方欢迎一起交流,为何会出现这种情况呢?

 

 

分类:

技术点:

相关文章:

  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-12-09
猜你喜欢
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-11-18
  • 2021-10-22
  • 2021-11-29
相关资源
相似解决方案