元字符
.
#匹配除换行符意外任意字符(可以匹配多个,但一个"."只能匹配一个)
>>> re.match(".","12345")
<_sre.SRE_Match object; span=(0, 1), match='1'>
>>> re.match(".","_12345")
<_sre.SRE_Match object; span=(0, 1), match='_'>
>>> re.match(".....","a1b2c345")
<_sre.SRE_Match object; span=(0, 5), match='a1b2c'>
>>> re.match(".","\n12345")
>>
\d
#匹配0-9之间的数字
>>> re.match("\d","12345")
<_sre.SRE_Match object; span=(0, 1), match='1'>
>>> re.match("[0-9]","12345")
<_sre.SRE_Match object; span=(0, 1), match='1'>
\D
#匹配非数字
>>> re.match("\D","a1b2c345")
<_sre.SRE_Match object; span=(0, 1), match='a'>
>>> re.match("\D","1b2c345")
>>> re.match("\D","_a1b2c345")
<_sre.SRE_Match object; span=(0, 1), match='_'>
\w
#匹配有效字符(大小写字母,数字以及各国语言)
>>> re.match("\w","_a1b2c345")
<_sre.SRE_Match object; span=(0, 1), match='_'>
>>> re.findall("\w","a1b2c345")
['a', '1', 'b', '2', 'c', '3', '4', '5']
>>> re.findall("\w"," 中国_a1b2c345")
['中', '国', '_', 'a', '1', 'b', '2', 'c', '3', '4', '5']
\W
#匹配非有效字符(特殊符号)
>>> re.findall("\W"," 中国_a1b2\tc345")
[' ', '\t']
>>> re.findall("\W"," 中国_a1b2\nc345")
[' ', '\n']
>>> re.match("\W"," 中国_a1b2\nc345")
<_sre.SRE_Match object; span=(0, 1), match=' '>
\s
#匹配空格位(支持\t,\n)
>>> re.findall("\s","\n 空格")
['\n', ' ']
>>> re.findall("\s","\t 空格")
['\t', ' ']
>>> re.findall("\s"," 空格")
[' ']
\S
#匹配非空格位
>>> re.findall("\S"," 空格")
['空', '格']
>>> re.findall("\S","\n 空格")
['空', '格']
^
#匹配字符串的开始
>>> re.findall("^\d.*","333caisdfj453")
['333caisdfj453']
$
#匹配字符串的结束
>>> re.findall("\d.*$","333caisdfj453")
['333caisdfj453']
#以数字开头,以x结尾
>>> re.findall("\d.*x$","f333caisdfj45x")
['333caisdfj45x']
[ ]
#匹配 [] 中列举的字符
\u4e00-\u9fa5 #中文编码
>>> re.findall("[A-Za-z0-9]","f333caisdfj45x")
['f', '3', '3', '3', 'c', 'a', 'i', 's', 'd', 'f', 'j', '4', '5', 'x']
>>> re.findall("[\u4e00-\u9fa5]","中国牛逼")
['中', '国', '牛', '逼']
\b
#匹配单词的开始和结束(单词左右要有空格)
>>> re.findall(r"\bgood\b","today is good day")
['good']
转义符:
' \ ' 表示 ' \\\\ ' ===> r "\\"
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没法指定它们,因为它们会被解释成其它的意思。这时你就必须使用\来取消这些字符的特殊意义。因此,你应该使用 \.和 \*。当然,要查找 \ 本身,你也得用 \\.
>>> re.match("c:\\","c:\\a\\b") #会报错,因为\\转义后就变成了\了
<_sre.SRE_Match object; span=(0, 3), match='c:\\'>
>>> re.match(r"c:\\","c:\\a\\b")
<_sre.SRE_Match object; span=(0, 3), match='c:\\'>
重复:
常用的限定符 | |
代码/语法 | 说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
下面是一些使用重复的例子:
Windows\d+匹配Windows后面跟1个或更多数字
1[356789]\d{9}匹配以13后面跟9个数字(中国的手机号)
^\w+匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)
re.match("[A-Z][a-z]*","Liujianhong")
re.match("[A-Za-z]*","LiuJianhong")
re.match("[A-Z][a-z]*","LiuJianhong")
re.match("[a-zA-Z_]+[\w_]*","LiuJianhong3")
re.match("[0-9]?[\d]","1")
re.match("[0-9]?[\d]","111")
re.match("\w{5}","1sadfasdf11")
re.match("\w{5,}","1sadfasdf11")
re.match("\w{5,9}","1sadfasdf11")
re.match(".*\\bliu\\b","i isliu fas fsa5 662 2a") # 注意为什么使用点
re.match(r".*\bliu\b","iis liu fas fsa5 662 2a") # 结果同上反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
常用的反义代码 | |
代码/语法 | 说明 |
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
案例如下:
re.match("[^abcd]","a") #表示除a、b、c、d外的任何字符都匹配
re.match("[^abcd]","b")
re.match("[^abcd]","e")
|
分组
我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复一个字符串又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作。
案例如下:
re.match("100|[1-9][0-9]|[0-9]","2") # 匹配100以内的数
re.match("100|[1-9]?\d$","2")
re.match("\d+(183|192|168)\s","452183 ") re.match("\d+(183|192|168)\s","452183 ").group() re.match("\d+(183|192|168)\s","452183 ").group(1) #注意当输入1的结果 re.match("\d+(183|192|168)\.(li|wang|liu)","452168.wang").group(2)
re.match("(.*)-(\d+)","0931-5912872 ").group(2) #小括号的使用场景,特别方便
re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>","<a>liujianhong</a>") #看似正确,其实Error
re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>","<a>liujianhong</html>") #这个就是漏洞
re.match(r"<([a-zA-Z] *)>\w*</ \1>","<a>liujianhong</html>") #此时\1表示第一个括号中的值
re.match("<([a-zA-Z] *)>\w*</ \\1>","<a>liujianhong</html>") #这样也行
|
re模块的高级应用
1、search
#执行正则表达式搜索并且在搜索结束后返回所匹配到的串,只返回第一次匹配到的结果
>>> res = re.search(r"\d+","浏览量333")
>>> res.group()
'333'
2、findall
#匹配所有对象,返回一个列表
>>> re.findall(r"\d+","当前浏览量888,回帖人数222")
['888', '222']
3、sub
#实现查找替换
>>> re.sub(r"\d+","1024","当前浏览量8848次")
'当前浏览量1024次'