python笔记之正则表达式

正则表达式

正则表达式(regular expression)

什么正则表达式?
我们希望只提取出我们所关注的数据,此时就可以用正则表达式
正则表达式就是一种进行数据筛选的表达式
正则表达式就是用一种特殊规则的字符串,来表达对字符串的一种过滤(称作匹配)

什么是原子?
原子就是正则表达式的一个基本组成的单位,每个正则表达式至少要包含一个原子

  1. 普通字符作为原子
    示例:
import re
string = "http://www.baidu.com"
pat = "baidu"
result = re.search(pat,string)
print(result)

运行结果:

<_sre.SRE_Match object; span=(11, 16), match='baidu'>
  1. 非打印字符作为原子
import re
string = "abc\ndef"
pat = "\n"
result = re.search(pat,string)
print(result)

运行结果:

<_sre.SRE_Match object; span=(3, 4), match='\n'>
  1. 通用字符作为原子
    \w : 匹配单字符,大小写字母,数字,下划线,等价于[a-zA-Z0-9]
    \W : 匹配到任何非单词字符,等于[^a-zA-z0-9]
    \d : 匹配到一个数字字符,等价于[0-9]
    \D : 匹配到一个非数字字符等价于[^0-9]
    \s : 匹配到任何空白字符,包括空格,制表符,换页符等等,等价于[\f\n\t\v]
    \S : 匹配到任何非空白字符,等价于[^\f\n\t\v]

    示例:

    import re
    string = "abcd123gdsa"
    pat = "\w"  #匹配单字符,所以会显示a
    result = re.search(pat,string)
    print(result)

    运行结果:

    <_sre.SRE_Match object; span=(0, 1), match='a'>
  2. 原子表(表示范围)
    匹配大小写字母,数字,下划线 [a-zA-Z0-9]
    匹配数字 [0-9]
    匹配非数字 [^0-9]
    示例:
import re
string = "as123dfzvz23cv"
pat = "[123]+"
result = re.search(pat,string)
print(result)

运行结果:

<_sre.SRE_Match object; span=(2, 5), match='123'>
  1. 元字符:就是正则表达式中具有一些特殊含义的字符,比如:重复N次前面的字符
"."  匹配除了换行符(\n)以外的任何单个字符
    "^"  匹配到字符串开始的位置
    "$"  匹配到字符串结束的位置
    "*"  匹配0次,1次或者多次前面的原子    等价于{0,}
    "?"  匹配0次,1次                     等价于{0,1}
    "+"  至少可以出现一次(1次或多次)     等价于{1,}
    num{n} 前面的数字至少可以出现几次,具体的次数要在{}中体现  
    num{n,} 前面的数字至少可以出现几次
    num{min,max} 前面的数字最少出现min次,最多出现max次  
    t|s  匹配t|s
    ()    模式单元,用于提取某一个内容  
  1. 模式修改符
    在不改变正则表达式的情况下,通过模式修正符来改变正则表达式的含义从而实现匹配结果的调整
    I 匹配时忽略大小写
    N 多行匹配
    L 本地化识别匹配
    S 让”.”匹配换行符
    示例:
import re
string = "adfpythonsns"
pat = "Python"
result = re.search(pat,string,re.I)
print(result)

运行结果:

<_sre.SRE_Match object; span=(3, 9), match='python'>

7.贪婪模式和懒惰模式
贪婪就是尽可能多去匹配
懒惰尽可能少的去匹配
贪婪模式示例:

import re
string = "faffafpythonsadfapy"
pat = "p.*y"
result = re.search(pat,string)
print(result)

运行结果:

<_sre.SRE_Match object; span=(6, 19), match='pythonsadfapy'>

懒惰模式示例:

import re
string = "faffafpythonsadfapy"
pat = "p.*?y"
result = re.search(pat,string)
print(result)

运行结果:

<_sre.SRE_Match object; span=(6, 8), match='py'>

正则表达式函数

re.search()

扫描整个字符串并返回第一个成功的匹配,存在多个也只会返回一个

re.match()

尝试从字符串的起始位置匹配,如果不是起始位置的话,match()就返回None

import re
print(re.match("www","www.baidu.com"))  #匹配成功
print(re.match("com","www.baidu.com"))  #匹配失败

运行结果:

<_sre.SRE_Match object; span=(0, 3), match='www'>
None
re.search()和re.match()的区别:

re.match() 只匹配字符串的开始,如果开始就不符合规则,则匹配失败,返回None
re.search() 匹配整个字符串,直到一个成功的匹配

re.sub()

检索和替换

    语法: re.sub(pattern,repl,string)
          re.sub(正则表达式,替换字符,被替换的字符串)
          -patten 规则  
          -repl 替换的字符
          -string 原始字符串  
          -count 模式匹配后替换的最大次数,默认0表示替换所有匹配的值

示例:

import re
phone = "123-343-5553 # 这是个电话号码"

#删除注释
# num = re.sub("#.*$","",phone)
num = re.sub("\D","",phone)
print(num)

运行结果:

1233435553

全局匹配函数

re.compile(Pattern) –
用于编译正则表达式,生成一个正则表达式对象供match() , search() 这两个函数来使用
示例,

import re
pattern = re.compile(r"\d+")
resultp = pattern.findall("runoob 123 google 456")  #以列表形式返回
print(resultp)

运行结果:

['123', '456']

猜你喜欢

转载自blog.csdn.net/key_book/article/details/80243800