Python学习---重点模块之re
Posted 小a玖拾柒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习---重点模块之re相关的知识,希望对你有一定的参考价值。
正则表达式是用来操作字符串,但是字符串提供的正则是完全匹配,有时候我们需要进行模糊匹配,这个时候就需要正则表达式了。通过re模块来实现,由C语言来执行底层的匹配
字符匹配(普通字符,元字符):
1 普通字符:大多数字符和字母都会和自身匹配
2 元字符:. ^ $ * + ? { } [ ] | ( ) \\
. : 通配符,[注意,点不能匹配换行符,且只代表一位字符]
^ : 匹配以什么为开始的字符
$: 匹配以什么为结尾的字符
*: [0, +00],重复匹配任意位
+: [1, +00],至少有一位
?: [0, 1],出现0次或者1次
(): 分组,在findall()匹配的时候,只返回分组里面的内容
{m,n}:出现m到n次
[a-z]: 出现a-z的任意字符,而且取消元字符的特殊功能,而且^代表取反的效果
[^g]: 取出不是g开头的字符
\\: 消除元字符特殊含义; 与特殊字母有特殊功能
\\d 匹配任何十进制数;它相当于类 [0-9]。
\\D 匹配任何非数字字符;它相当于类 [^0-9]。
\\s 匹配任何空白字符;它相当于类 [ \\t\\n\\r\\f\\v]。
\\S 匹配任何非空白字符;它相当于类 [^ \\t\\n\\r\\f\\v]。
\\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\\b 匹配一个特殊字符边界,比如空格 ,&,#等
re.findall(): 返回所有结果,返回到一个列表里面
import re print(re.findall(\'\\d\', \'hello123world\')) # [\'1\', \'2\', \'3\'] print(re.findall(\'\\d+\', \'hello123world\')) # [\'123\'] print(re.findall(\'w\\w{2}ld\', \'hello123world\')) # [\'world\'] print(re.findall(\'w..d\', \'hello123world\')) # [] 匹配失败,因为匹配个数不同 print(re.findall(\'w...d\', \'hello123wo\\nld\')) # [] 匹配失败,因为不匹配换行符 print(\'hello123wo\\tld\') # hello123wo ld print(re.findall(\'w...d\', \'hello123wo\\tld\')) # [\'wo\\tld\'] print(re.findall(\'w...d\', \'hello123world\')) # [\'world\'],一个点只能匹配且只能任意一个字符[不能匹配换行符] print(re.findall(\'^h...o\', \'hello123world\')) # 匹配以h开头的字符,[\'hello\'] print(re.findall(\'d$\', \'hello123world\')) # 匹配以d结尾的字符,[\'d\'] print(re.findall(\'.*d\', \'hello123world\')) # 匹配任意字符到d结束,[\'hello123world\'] print(re.findall(\'hel+o\', \'hello123world\')) # 匹配任意至少一个l字符到o结束,[\'hello\'] print(re.findall(\'a?b\', \'aaaabbhabafb\')) # [\'ab\', \'b\', \'ab\', \'b\'] print(re.findall(\'a{1,6}b\', \'aaaabbhabafb\')) # [\'aaaab\', \'ab\'] print(re.findall(\'[g,m]od\', \'god\')) # [\'god\'] print(re.findall(\'[g,m]od\', \'mod\')) # [\'mod\'] print(re.findall(\'[a-z]\',\'helloworld\')) # [\'h\', \'e\', \'l\', \'l\', \'o\', \'w\', \'o\', \'r\', \'l\', \'d\'] print(re.findall(\'[a-z,*]\',\'hell*\')) # [\'h\', \'e\', \'l\', \'l\', \'*\'],取消元字符特殊含义 print(re.findall(\'[1-9a-zA-Z]\', \'he73wo\')) # [\'h\', \'e\', \'7\', \'3\', \'w\', \'o\'] print(re.findall(\'[1-9, a-z, A-Z]\', \'he73wo\')) # [\'h\', \'e\', \'7\', \'3\', \'w\', \'o\'] print(re.findall(\'[^ab]\', \'45bdhab3\')) # [\'4\', \'5\', \'d\', \'h\', \'3\'] print(re.findall(\'[^ab]\', \'45bdh"ab"3\')) # [\'4\', \'5\', \'d\', \'h\', \'"\', \'"\', \'3\'] print(re.findall(\'a[bc]d\', \'abcd\')) # [], 仅能匹配一个 print(re.findall(\'a[b,c]d\', \'abcd\')) # [], 仅能匹配一个 print(re.findall(r\'(ad)+\', \'adad\')) # [\'ad\'] print(re.findall(\'www.(\\w+)\', \'www.baidu.com\')) # [\'baidu\']分组后,仅仅打印分组里面的内容 print(re.findall(\'www.(?:\\w+).com\', \'www.baidu.com\')) # [\'www.baidu.com\'] 取消分组优先级打印分组内容 关于斜杠的特殊说明:我们输入的\\,再解释器解释的时候就是\\\\ re里面的\\和python里面的\\都有特殊意义,所以需要2次的解释,所以4个\\ # print(re.findall(\'\\\\\\\', \'hell\\oworld\')) # 错误 print(re.findall(\'\\\\\\\\\', \'hell\\oworld\')) # [\'\\\\\'] # print(re.findall(r\'\\\', \'hell\\oworld\')) # 错误 print(re.findall(r\'\\\\\', \'hell\\oworld\')) # [\'\\\\\'] print(re.search(r\'\\bblow\', \'blow\').group()) # blow, 边界查找
re.search(): 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None
import re print(re.search(\'sb\', \'hellosbworldsb\').group()) # sb
re.match(): 只在字符串开始匹配; 返回一个对象,利用group()输出结果
import re print(re.match(\'\\d+\', \'hell123\')) # 匹配失败,只在开始匹配 print(re.match(\'\\d+\', \'123helwo\').group()) # 返回一个对象,利用group()打印
re.split(): 先根据第一个标准切割,然后在此基础上进行第二次切割,同时还可以指定切割次数
如果要切割的字符在首字母,默认前面有一个空格,所以会切个出来一个空
import re print(\'stsrongtr\'.split(\'t\')) # [\'s\', \'srong\', \'r\'] print(\'stsrongtr\'.split(\'s\')) # [\'\', \'t\', \'rongtr\'] print(re.split(\'s\', \'strongstr\')) # [\'\', \'trong\', \'tr\'] print(re.split(\'[s,t]\', \'stsrongtr\')) # [\'\', \'\', \'rong\', \'\', \'r\'] 先根据s进行切分,后根据t对s切割的切分 print(re.split(\'[s,t]\', \'stsrongtr\', 2)) # [\'\', \'\', \'srongtr\'] 首字母切割
re.sub():字符串替换
import re print(re.sub(\'\\d+\', \' \', \'hello123world\')) # hello world
re.compile()
import re com = re.compile(\'\\d+\') print(com.findall(\'hello123world\')) # 调用com里面的findall()方法
re.finditer(): 返回一个迭代器对象,利用next()和group()取出值
import re ret = re.finditer(\'\\d+\', \'hello123wo456rld\') print(ret) # <callable_iterator object at 0x00000000007D40F0> print(next(ret).group()) print(next(ret).group())
以上是关于Python学习---重点模块之re的主要内容,如果未能解决你的问题,请参考以下文章