正则表达式基础

时间:2019-03-25
本文章向大家介绍正则表达式基础,主要包括正则表达式基础使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

re.match

尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

re.match(pattern,string,flags=0)

第一个参数是正则表达式

第二个参数表示要匹配的字符串

第三个参数是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等

1、最常规的匹配

import re

content = 'Hello 123 4567 World_Have a good mood every day'
#print(len(content))

result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}.*day$',content)
print(result)
print(result.group())
print(result.span())

输出结果为:

<_sre.SRE_Match object; span=(0, 47), match='Hello 123 4567 World_Have a good mood every day'>

Hello 123 4567 World_Have a good mood every day
(0, 47)

PS

group() == group(0) == 所有匹配的字符,与括号无关,这个是API规定,而m.groups() 返回所有括号匹配的字符

span():表示匹配结果的范围

 2、泛匹配

import re

content = 'Hello 123 4567 World_Have a good mood every day'

result = re.match('^Hello.*day$',content)
print(result)
print(result.group())
print(result.span())

输出结果为:(同上)

<_sre.SRE_Match object; span=(0, 47), match='Hello 123 4567 World_Have a good mood every day'>

Hello 123 4567 World_Have a good mood every day
(0, 47)

3、匹配目标

import re

content = 'Hello 1234567 World_Have a good mood every day'

result = re.match('^Hello\s(\d+)\sWorld.*day$',content)
print(result)
print(result.group(1))
print(result.span())

输出结果:

<_sre.SRE_Match object; span=(0, 46), match='Hello 1234567 World_Have a good mood every day'>
1234567
(0, 46)

PS:

group(1):输出第一个括号匹配的所有字符,2、3以此类推

4、贪婪匹配

import  re

content = 'Hello 1234567 World_Have a good mood every day'

result = re.match('^He.*(\d+).*day$',content)
print(result)
print(result.group(1))

输出结果:

<_sre.SRE_Match object; span=(0, 46), match='Hello 1234567 World_Have a good mood every day'>
7

PS:123456被 .* 匹配掉了,.*会匹配尽可能多的字符,因为后面有(\d+)它至少要匹配一个数字,所以最后输出结果是一个7

5、非贪婪匹配

import  re

content = 'Hello 1234567 World_Have a good mood every day'

result = re.match('^He.*?(\d+).*day$',content)
print(result)
print(result.group(1))

输出结果:

<_sre.SRE_Match object; span=(0, 46), match='Hello 1234567 World_Have a good mood every day'>
1234567

PS:加上?指定模式是非贪婪匹配,会匹配尽可能少的字符,.*?(\d+)表示如果发现 .*?后面匹配的是数字,它会把前面无关内容匹配掉

6、匹配模式

import re

content = '''Hello 1234567 World_Have a 
good mood every day'''

result = re.match('He.*?(\d+).*?day$',content,re.S)
print(result)
print(result.group(1))

输出结果:

<_sre.SRE_Match object; span=(0, 47), match='Hello 1234567 World_Have a \ngood mood every day'>
1234567

PS:a后面有换行符,.(点)不能匹配换行符,加上re.S 就可以正常输出

7、转义

import re

content = 'price is $5.00'

result= re.match('price is $5.00',content)
print(result)

result= re.match('price is \$5\.00',content)
print(result)

输出结果:

None
<_sre.SRE_Match object; span=(0, 14), match='price is $5.00'>

PS:尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,有换行符就用 re.S

re.search

扫描整个字符串并返回第一个成功的匹配

import  re

content = 'Extra strings Hello 1234567 World_Have a good mood every day Extra strings'

result = re.match('Hello.*?(\d+).*?day',content)
print(result)

result = re.search('Hello.*?(\d+).*?day',content)
print(result)
print(result.group(1))

输出结果:

None

<_sre.SRE_Match object; span=(14, 60), match='Hello 1234567 World_Have a good mood every day'>

1234567

PS:为匹配方便,能用search就不用match

re.findall

搜索字符串,以列表形式返回全部能匹配的子串

import re

html = '''<div class="over">
    <ul class="product_ul ">
        <li class="line1 ">
            <a class="img" href="http://product.dangdang.com/26515962.html" title="我有预感明天也会喜欢你">
                <img alt="我有预感明天也会喜欢你" src="http://img3m2.ddimg.cn/0/23/26515962-1_l_4.jpg"/>
            </a>
            <p class="name" >
                <a href="http://product.dangdang.com/26515962.html" title="我有预感明天也会喜欢你">
                    我有预感明天也会喜欢你
                </a>
            </p>
            <p class="author">张一然、么么晗,白马时光 出品</p>
            <p class="price">¥27.40</p>
        </li>
        <li class="line2 ">
            <img alt="都挺好(套装共两册)" src="http://img3m5.ddimg.cn/70/28/26445445-1_l_4.jpg"/>
            <p class="name">都挺好(套装共两册)</p>
            <p class="author">阿耐</p>
            <p class="price">¥68.70</p>
        </li>
        <li class="line3 ">
            <a class="img" href="http://product.dangdang.com/26514792.html" title="林徽因传:人生从来都靠自己成全">
                <img alt="林徽因传:人生从来都靠自己成全" src="http://img3m2.ddimg.cn/18/0/26514792-1_l_10.jpg"/>
            </a>
            <p class="name">
                <a href="http://product.dangdang.com/26514792.html" title="林徽因传:人生从来都靠自己成全">
                    林徽因传:人生从来都靠自己成全
                </a>
            </p>
            <p class="author">程 碧</p>
            <p class="price">¥51.60</p>
        </li>
    </ul>
</div>
'''
results = re.findall('<li.*?href="(.*?)".*?title="(.*?)">.*?author.>(.*?)...>',html,re.S)
print(results)
print(type(results))
for result in results:
    #print(result)
    print(result[0],result[1],result[2])

输出结果:

[('http://product.dangdang.com/26515962.html', '我有预感明天也会喜欢你', '张一然、么么晗,白马时光 出品'), ('http://product.dangdang.com/26514792.html', '林徽因传:人生从来都靠自己成全', '程 碧')]
<class 'list'>
http://product.dangdang.com/26515962.html 我有预感明天也会喜欢你 张一然、么么晗,白马时光 出品
http://product.dangdang.com/26514792.html 林徽因传:人生从来都靠自己成全 程 碧

PS:结果中没有 都挺好 的相关内容

用以下代码可以解决:

results = re.findall('<li.*?alt="(.*?)"\s.*?(<a.*?>)?.*?author.>(.*?)...>',html,re.S)

for result in results:
    #print(result)
    print(result[0])

输出结果:

我有预感明天也会喜欢你
都挺好(套装共两册)
林徽因传:人生从来都靠自己成全

PS:  (<a.*?>)?   ()内代表一个整体,这个地方的意思是匹配0个或者1个a标签

     多说一句:例如 <li.*?>\s*? 匹配0个或多个空白符(有或没有都可匹配)

re.sub

替换字符串中每一个匹配的子串后返回替换后的字符串

import re

content = 'Extra strings Hello 1234567 World_Have a good mood every day Extra strings'
content = re.sub('\d+','',content)
print(content)

content = 'Extra strings Hello 1234567 World_Have a good mood every day Extra strings'
content = re.sub('\d+','Replacement',content)
print(content)

content = 'Extra strings Hello 1234567 World_Have a good mood every day Extra strings'
content = re.sub('(\d+)',r'\1 8910',content)
print(content)

 输出结果:

Extra strings Hello  World_Have a good mood every day Extra strings
Extra strings Hello Replacement World_Have a good mood every day Extra strings
Extra strings Hello 1234567 8910 World_Have a good mood every day Extra strings

PS:替换的目标是原字符串本身或者包含原字符串,把 \d+ 加上括号,括号里面的内容可以用group(1)拿到,用 \1 拿到匹配内容,用 r 表示原生字符串,也就是说 \1 就是把第一个括号里的内容取到,最后做一下替换

re.compile

将正则字符串编译成正则表达式对象,以便于复用该匹配模式

import re

content = '''Hello 1234567 World_Have a 
good mood every day'''
 
pattern = re.compile('Hello.*day',re.S)
result = re.match(pattern,content)
print(result)

输出结果:

<_sre.SRE_Match object; span=(0, 47), match='Hello 1234567 World_Have a\n good mood every day'>

 最后分享一个 在线正则表达式测试网站  http://tool.oschina.net/regex/#