正则表达式
序言
有些人面临一个问题时会想:“我知道,可以使用正则表达式来解决这个问题。”于是现在他们就有两个问题了 ——Jamie Zawinski
通配符
别被这个名字吓到了,因为我一开始看它的时候就被吓到了。通配符其实就是一个“.”,它可以匹配任何字符,并且只能匹配一个。比如“.ython”只能匹配到“python”、“qython”、或者别的“+ython”。但是不能匹配到“qpython”因为通配符只能匹配到一个字符。
令人头痛的转义
如果我想匹配python.org怎么办,在“python.org”里面有一个点“.”,这在正则表达式中是通配符啊。他有可能会匹配成“pythonaorg”对吧。所以我们需要转义,ok,现在要打起精神,我们需要在它的前面加上反斜线了“python\\.org”
python\\.org
ok,本来我们只要转义“.”不就好了么,"."转义是“\.”,那为什么上面要两个斜线呢?这里面涉及到两层转义,一个是解释器的转义,另一个是re模块的转义。为了让我看的更加明白我要把这里我用markdown编辑的内容截个图就明白了,其实为了让文章显示我想要的符号,我已经使用了一次转义了。这里请细细体会
[图片上传失败...(image-9b7137-1608204850092)]
上面的图文请对比转义的地方看,会有所启发
如果真的很讨厌这样写的话,可以使用原始字符串r'python\.org'
选择符和子模式
我想要的那么多,不可能只匹配个python吧,如果我想要“python”和“perl”呢?使用选择符“python|perl”,但是他们都有一个相同的部分“p”’,那就使用子模式,括号括起来的部分就是子模式了,“p(ython|erl)”。
可选项和重复子模式
在子模式后面加上问号,他就变成了可选项。他可能出现在匹配字符串中,但并非必须的。例如
r'(http://)?(www\.)?python\\.org'
使用了什么呢,首先是使用了原始字符串,过滤了一次转义,然后是两个可选项对吧
它只能匹配到这几种字符串
'http://www.python.org'
'www.python.org'
'http://python.org'
'python.org'
可选项表示模式可以出现一次或者根本不出现。下面这些运算符允许子模式重复多次。
(pattern)*:允许模式重复0次或多次
(pattern)+:允许模式重复1次或多次
(pattern){m,n}:允许模式重复m到n次
字符串的开始和结尾
'^'表示以什么开始
'$'表示以什么结尾
常用的方法
compile()
re.compole将正则表达式(以字符串书写的)转换为模式对象,你也许不知道模式对象是什么,现记住它叫pattern
search()
函数search会在给定字符串中寻找第一个匹配给定正则表达式的自字符串。
re.search(pat, string)
里面的pat是用字符串表示的正则表达式。
上式等价于
pat.search(string)
这里的pat,就是一个由compile()转换的一个模式对象了。明白了吧