正则表达式基础

Posted sheng-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式基础相关的知识,希望对你有一定的参考价值。

技术图片

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(^Hellosdddsd{4}sw{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(^Hellos(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 good 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+),r1 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 good mood every day‘>

 

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

 

以上是关于正则表达式基础的主要内容,如果未能解决你的问题,请参考以下文章

python基础学习(十三)

python基础学习笔记(十三)

text 正则表达式片段

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配