本文语法使用的是python3.5,请大家注意版本问题
首先定义一个要匹配的字符串
matchStr = ‘www.baidu.com’
re.match
从给定的字符串开头开始匹配,如果匹配到会返回一个match object,如果匹配失败,则会返回None.
参数:
pattern:正则表达式
string:要匹配的字符串
flags:可以添加的参数r.I等
例子:
#如果匹配的字符在开头
In [**3**]: ma = re.match(r'www',matchStr)
#匹配成功返回match object
In [**4**]: ma.group()
Out[**4**]: 'www'
#如果匹配的字符串不在开头
In [**5**]: ma = re.match(r'com',matchStr)
#匹配是吧,返回值为None
In [**6**]: type(ma)
Out[**6**]: NoneType
假如我们只想匹配baidu怎么办呢
这时候我们可以使用search
re.search
扫描整个字符串,返回匹配成功的结果,返回值为match object,如果匹配失败,返回值为None
参数:
pattern:正则表达式
string:要匹配的字符串
flags:可以添加的参数r.I等
还是来个例子:
#匹配开头,没有问题
In [**11**]: ma = re.search(r'www',matchStr)
In [**12**]: ma.group()
Out[**12**]: 'www'
#匹配中间
In [**13**]: ma = re.search(r'baidu',matchStr)
#我们发现也没有问题
In [**14**]: ma.group()
Out[**14**]: 'baidu'
re.split
这个方法就厉害了,可以按照正则表达式来分割字符串,返回值为list
参数:
pattern:正则表达式
string: 要分割的字符串
maxsplit=0:最大分割的个数,默认0为全部分割
flags=0:可以添加的参数r.I等
这里有几个比较复杂的情况
1.pattern为一个group
2.pattern为一个group,匹配的字符出现在了开头
3.pattern为一个group,匹配的字符出现在了结尾
让我们一个一个来分析:
1.先来一个正常模式
#通过非数字英文来分割,于是返回值为 ['www', 'baidu', 'com']
In [**18**]: re.split(r'\W+','matchStr')
Out[**18**]: ['www', 'baidu', 'com']
2.让我们看看第一个,pattern为一个group
#通过非数字英文来分割
In [**23**]: re.split(r'(\W+)','matchStr')
Out[**23**]: ['www', '.', 'baidu', '.', 'com']
我们观察结果发现为什么多了两个’.’,让我们来看一下官方文档
If capturing parentheses are used in pattern, then the text of all groups in the pattern are also returned as part of the resulting list.
如果你使用分组来匹配,那么你分组匹配到的结果也会返回到结果list中.这样一来也就合理了
3.让我们看一下第二个与第三个情况
In [**25**]: re.split(r'\W+','..'+matchStr+'..')
Out[**25**]: ['', 'www', 'baidu', 'com', '']
仔细观察,开头语结尾会有两个”,让我们看一下文档
If there are capturing groups in the separator and it matches at the start of the string, the result will start with an empty string. The same holds for the end of the string
如果的分割匹配在开头或者结尾,你会发现,结果将会以一个空字符串为开头或者结尾.
虽然这里提到了分割组,但是尝试了一下,不用分组也是可以的.
re.findall
这个方法将会从左到右匹配到所有的满足条件的string然后作为一个list返回,如果没有匹配到结果则会返回空list
参数:
pattern:正则表达式
string:要匹配的字符串
flags=0:可以添加的参数r.I等
来看个例子:
#匹配www.baidu.com中.
In [**31**]: re.findall(r'\.',matchStr)
Out[**31**]: ['.', '.']
#由于matchStr没有bbb于是返回结果为空
In [**32**]: re.findall(r'bbb',matchStr)
Out[**32**]: []
re.finditer
这个方法与findall很是类似,不过这里将会返回一个迭代器,迭代器中的每个对象都是match object,如果匹配结果为空,则返回的迭代器中将不会存有数据
pattern:正则表达式
string:要匹配的字符串
flags=0:可以添加的参数r.I等
例子走起:
#匹配到www.baidu.com中所有的.
In [**35**]: ma_iter = re.finditer(r'\.',matchStr)
In [**36**]: **for** ma **in** ma_iter:
...: **print** ma.group()
...:
#输出结果
.
.
#匹配bbb试一下
In [**37**]: ma_iter = re.finditer(r'ccc',matchStr)
#返回得到了一个迭代器
In [**38**]: ma_iter
Out[**38**]: <callable-iterator at 0x103f3c050>
#看一下遍历结果,结果没有打印任何东西
In [**40**]: for ma in ma_iter:
...: print ma.group()
...:
In [**41**]:
re.sub
好吧,我承认第一眼看到还以为是什么减法,英语渣的不行- -! ,这里是将匹配到的字符串替换成想要替换的字符,然后将替换好的字符串返回.
参数:
pattern:正则表达式
repl:替换的字符串
string:匹配的字符串
count=0:匹配替换的个数
flags=0:正则表达式参数re.I等
例子例子:
#将www.baidu.com中的.替换成&
In [**41**]: re.sub(r'\.','&',matchStr)
Out[**41**]: 'www&baidu&com'
#将www.baidu.com中的第一个.替换成&
In [**42**]: re.sub(r'\.','&',matchStr,1)
Out[**42**]: 'www&baidu.com'