re模块与正则表达式

1.re模块与正则表达式之间的关系

  正则表达式不少python独有的,它是一门独立的技术。所有的编程语言都可以使用正则表达式,但是如果你想在python中使用,你就必须依赖于re模块。

2.字符

字符:

元字符

匹配内容

.

匹配除换行符以外的任意字符

w

匹配字母或数字或下划线

W

匹配非字母或数字或下划线

s

匹配任意的空白符

S

匹配非空白符

d

匹配数字

D

匹配非数字

匹配一个换行符

匹配一个制表符



匹配一个单词的结尾

^

匹配字符串的开始  (类似于startswith

$

匹配字符串的结尾  (类似于endswith

^$连用,会精确限制匹配的内容,两者中间写什么,就是什么字符

a|b

匹配字符a或字符b(把长的写在前面)

()

匹配括号内的表达式,也表示一个组

[…]

匹配字符组中的字符

[^…]

匹配除了字符组中字符的所有字符(取反)

3.量词

  (1)量词必须跟在正则符号的后面

  (2)量词只能够限制住紧挨着它的那一个正则符号

  正则表达式在匹配的时候默认为贪婪模式(即尽量匹配多的),可以通过在量词后面加一个? ,就可以将贪婪匹配变成非贪婪匹配(即惰性匹配)。

量词:

量词

用法说明

*

重复零次或更多次

+

重复一次或更多次

重复零次或一次

{n}

重复n

{n,}

重复n次或更多次

{n,m}

重复nm

(.*?)的用法

# .    是任意字符
# *   是取0至无线长度
# ?  是非贪婪模式
# 组合在一起就是指:取尽量少的任意字符,一般用于:.*?x
#    意思是取前面任意长度的字符,直到一个x出现

4.re模块下的常用方法

import re
ret = re.findall('a','apple,age,add')#返回所有满足匹配条件的结果,放在列表里
print(ret)
#>>>:['a', 'a', 'a']
# 函数会在字符串内通过查找模式匹配,直到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

ret = re.match('a','apple,age,add').group()  # 同search,不过尽在字符串开始处进行匹配
print(ret)
#>>>:a

ret = re.split('[ab]','acbcd') # 先按'a'分割得到''和'cbcd',在对''和'cbcd'分别按'b'分割
print(ret)
>>>:['', 'c', 'cd']

ret = re.sub('d','H','ead5fkaj3fas6h',2)#将数字替换成'H',参数2表示只替换2个数字
print(ret)
>>>:eadHfkajHfas6h

ret = re.subn('d', 'H', 'eva3e2gon4yua2n4')#将数字替换成'H',返回元组(替换的结果,替换的次数)
print(ret)
>>>:('('evaHeHgonHyuaHnH', 5)

obj = re.compile('d{3}')#将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个l连续的数字
ret = obj.search('abcd1234ajf')#正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())
>>>:123

(1).findall的优先级

import re
ret= re.findall('www.(baidu|kugou).com','www.kugou.com')
print(ret)#findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
>>>:['kugou']

ret= re.findall('www.(?:baidu|kugou).com','www.kugou.com')
print(ret)#findall
>>>:['www.kugou.com']

(2)split的优先级查询

import re
ret = re.split('d+','abcd12e34f'print(ret)
>>>:['abcd', 'e', 'f']

ret = re.split('(d+)','abcd12e34f'print(ret)
>>>:['abcd', '12', 'e', '34', 'f']
# 在匹配部分加上()之后所切出的结果是不同的,没有()的就没有保留所匹配的项,
# 但是有括号的却能够保留了匹配的项,这个在某些需要保留匹配部分的使用过程是非常重要的。

(3) search与match的异同点

import re
ret = re.search('a','pplae age hard')
print(ret)# search不会给你直接返回匹配到的结果,而是给你返回一个对象
>>>:<_sre.SRE_Match object; span=(3, 4), match='a'>
print(ret.group())# 必须调用group才能看到匹配的结果
>>>:a
#注意:1.search只会依据正则查找一次,只要查到了结果,就不会再往后查找
      2.当查找的结果不存在的情况下,调用group直接报错
import re
ret = re.match('a','pplae age hard')
print(ret)
print(ret.group())
>>>:None
# 注意:1.match只会匹配字符串的开头部分。
       2.当字符串的开头不符合匹配规则的情况下,返回的也是None,此时如果再调用group也会报错。
原文地址:https://www.cnblogs.com/blue-tea/p/11202438.html