正则模块(标准库)

常用特殊字符匹配内容

字符匹配:

.
匹配除换行符(\n)以外的单个任意字符

\w
匹配单个字母、数字、汉字或下划线

\s
匹配单个任意的空白符

\d
匹配单个数字

\b
匹配单词的开始或结束

^
匹配整个字符串的开头

$
匹配整个字符串的结尾

次数匹配:

*
重复前一个字符 0 - n 次

+
重复前一个字符 1 - n 次


重复前一个字符 0 - 1 次

{n}
重复前一个字符 n 次 a{2} 匹配 aa

{n,}
重复前一个字符 n 次或 n 次以上 a{2,} 匹配 aa 或aaa 以上

{n, m}
重复前一个字符 n 到 m 次之间的任意一个都可以

Python 中使用正则的方法

match
只在整个字符串的起始位置进行匹配

示例字符串

string = "isinstance guangming enumerate www.baidu.com 1997"

示例演示:

import re
In [4]: r = re.match("is\w+", string)

In [8]: r.group()  # 获取匹配成功的结果
Out[8]: 'isinstance'

search
从整个字符串的开头找到最后,当第一个匹配成功后,就不再继续匹配。

In [9]: r = re.search("a\w+", string)

In [10]: r.group()
Out[10]: 'ance'    

findall
搜索整个字符串,找到所有匹配成功的字符串,比把这些字符串放在一个列表中返回。

In [16]: r = re.findall("a\w+", string)

In [17]: r
Out[17]: ['ance', 'angge', 'ate']

sub
把匹配成功的字符串,进行替换。

# 语法:
"""
("a\w+",    "100",        string,     2)
匹配规则,替换成的新内容,  被搜索的对象, 有相同的话替换的次数


"""
In [24]: r = re.sub("a\w+", "100", string, 2)
  
In [25]: r
Out[25]: 'isinst100 y100 enumerate www.baidu.com 1997'

# 模式不匹配时,返回原来的值

split
以匹配到的字符进行分割,返回分割后的列表

In [26]: string
Out[26]: 'isinstance guangming enumerate www.baidu.com  1997'

In [27]: r = re.split("a", string, 1)

使用多个界定符分割字符串

>>> line = 'asdf fjdk; afed, fjek,asdf,  foo'
>>> import re
>>> re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

正则分组

==从已经成功匹配的内容中,再去把想要的取出来==

# match
In [64]: string
Out[64]: 'isinstance guangming enumerate www.baidu.com  1997'

In [65]: r = re.match("is(\w+)", string)

In [66]: r.group()
Out[66]: 'isinstance'

In [67]: r.groups()
Out[67]: ('instance',)
    
    
    
# search
# 命名分组
In [87]: r = re.search("is\w+\s(?Py\w+e)", string)  

In [88]: r.group()
Out[88]: 'isinstance guangming'

In [89]: r.groups()
Out[89]: ('guangming',)

In [90]: r.groupdict()
Out[90]: {'name': 'guangming'}

    
# findall

In [98]: string
Out[98]: 'isinstance all yangge any enumerate www.qfedu.com  1997'

In [99]: r = re.findall("a(?P\w+)", string)

In [100]: r
Out[100]: ['nce', 'll', 'ngge', 'ny', 'te']

In [101]: r = re.findall("a(\w+)", string)

In [102]: r
Out[102]: ['nce', 'll', 'ngge', 'ny', 'te']

    
# split
In [113]: string
Out[113]: 'isinstance all yangge any enumerate www.baidu.com 1997'

In [114]: r = re.split("(any)", string)

In [115]: r
Out[115]: ['isinstance all guangming ', 'any', ' enumerate www.baidu.com 1997']

In [116]: r = re.split("(a(ny))", string)

In [117]: r
Out[117]:
['isinstance all guangming ',
 'any',
 'ny',
 ' enumerate www.baidu.com 1997']

In [118]: tag = 'value="1997/07/01"'

In [119]: s = re.sub(r'(value="\d{4})/(\d{2})/(\d{2})"', r'\1年\2月\3日"', tag)

In  [120]: s
Out [120]: value="1997年07月01日"

编译正则

对于程序频繁使用的表达式,编译这些表达式会更有效。
compile 函数用于编译正则表达式,返回的是一个正则表达式( Pattern )对象,利用这个对象的相关方法再去匹配字符串。


好处:
re 模块会维护已编译表达式的一个缓存。

不过,这个缓存的大小是有限的,直接使用已编译的表达式可以避免缓存查找开销。

使用已编译表达式的另一个好处是,通过在加载模块时预编译所有表达式,可以把编译工作转到应用 一开始时,而不是当程序响应一个用户动作时才进行编译。

In [130]: regexes = re.compile("y\w+")

In [131]: r = regexes.search(string)

In [132]: r.group()
Out[132]: 'guangming'

常用正则

# IP:
r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$'
# 手机号:
r'^1[3|4|5|8][0-9]\d{8}$'
# 邮箱:
[email protected]
[email protected]

r'[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+'

强调知识点

# 匹配所有包含小数在内的数字
print(re.findall('\d+\.?\d*',"asdfasdf123as1.13dfa12adsf1asdf3")) #['123', '1.13', '12', '1', '3']

#.*默认为贪婪匹配
print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b']

#.*?为非贪婪匹配:推荐使用
print(re.findall('a.*?b','a1b22222222b')) #['a1b']

元字符

# \b 表示匹配单词边界,详见后面的速查表

In [17]: re.search('hello\b', 'hello world')

In [18]: re.search('hello\\b', 'hello world')
Out[18]: <_sre.SRE_Match object; span=(0, 5), match='hello'>

你可能感兴趣的:(正则模块(标准库))