python re模块

正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于 匹配和替换文本。
python 中的re模块
1,主要方法
match 方法:从起始位置开始查找,一次匹配 。
search 方法:从任何位置开始查找,一次匹配 。
findall 方法:全部匹配,返回列表 。
finditer 方法:全部匹配,返回迭代器 。
split 方法:分割字符串,返回列表
sub 方法:替换 。
compile 方法: 用来编译正则表达式模式字符串,并生成 Regular Expression Objects。

2,参数讲解
flags参数:上面的函数都有这个参数。
flags 有很多可选值:
re.I(IGNORECASE)忽略大小写,括号内是完整的写法 。
re.M(MULTILINE)多行模式,改变^和$的行为 。
re.S(DOTALL)点可以匹配任意字符,包括换行符 。
re.L(LOCALE)做本地化识别的匹配。
re.U(UNICODE) 使用\w \W \s \S \d \D 使用取决于 unicode 定义的字符属性。在 python3 中默 认使用该 flag 。
re.X(VERBOSE)冗长模式,该模式下 pattern 字符串可以是多行的,忽略空白字符,并可以添加 注释 。

3,匹配规则

1,元字符
. 匹配除换行符(\n)以外的任意字符
\w 匹配大小写字母或数字或下划线或汉字 0-9、a-z、A-Z、_(下划线)、汉字和其他国家的语 言符号
\W 匹配非字母或数字或下划线或汉字,跟\w 正好相反
\s 匹配任意的空白符
\S 匹配任意非空白符
\d 匹配数字
\D 匹配非数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
[] 匹配[]中列举的字符

2,字符转义
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没法指定它们,因 为它们会被解释成其它的意思。这时你就必须使用\来取消这些字符的特殊意义。因此,你 应该使用.和*。当然,要查找\本身,你也得用\. 当然我们一般不用这种方法,一般在字符串前面添加一个r就可以去除字符转义了,例如:r’c:\’

3, 重复

  • 重复零次或更多次
  • 重复一次或更多次
    ? 重复零次或一次
    {n} 重复 n 次
    {n,} 重复 n 次或更多次
    {n,m} 重复 n 到 m 次

4,反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它 任意字符都行的情况,这时需要用到反义:
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了 x 以外的任意字符
[^aeiou] 匹配除了 aeiou 这几个字母以外的任意字符

5,分组
我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要 重复一个字符串又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以 指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作。
例如:
re.match(r"<([a-zA-Z] )>\w</ \1>",“123456”) #此时\1 表示第一个 括号中的值 (一般分组)。
re.match(r"<(?P\w*)><(?P\w*)>.*</(?P=n2)></(?P=n1)>", “123456”)(命名分组)

6,选择
l 代表选择 例如:
re.match("\d+(183|192|168)\s\1", “452183 183”) l 代表左右表达式任意匹配一个。它总是先匹配左边的表达式,一旦成功匹配成功则跳过匹配右边的表达式。如果l 没有被包括在()中,则它的范围是整个正则表达式。

4,例子:

import re

pattern = re.compile(r'\d+') 
m = pattern.match('one12twothree34four')
a = re.match('\\bpy', "python is good")
print(re.match(r'c:\\', "c:\\a\\b"))
print(a.group())
print(re.match("\w{5}", "1sadfasdffisfi11").group())
print(re.match(".*\\bliu\\b", "i is liu fas fsa5 662 2a").group())
print(re.match("100|[1-9][0-9]|[0-9]", "289"))
print(re.match("\d+(183|192|168)\s\\1", "452183 567183"))
print(re.match("\d+(183|192|168)\s", "452183 ").group(1))
print(re.match("\d+(183|192|168)\.(li|wang|liu)", "452456168.wang").group())
print(re.match("<([a-zA-Z] *)>\w*</.*?\\1>", "<a>1123</a>"))
print(re.match(r"<(?P<n1>\w*)><(?P<n2>\w*)>.*</(?P=n2)></(?P=n1)>", "<a><span>水电费</span></a>"))
re.match(r"<(\w*)><(\w*)>.*</\2></\1>","<a><span>liujianhong</span></a>")
print(re.sub(r"\d+", "1024", "当前浏览量是 8808 次"))
 re.findall(r'<B>(.*?)</B>', value1, re.S|re.M) 


def add(temp):
    print(temp)
    # return str(int(temp.group()) + 1)
    return "123"


print(re.sub(r"\d+", add, "当前浏览量是 8808 次,200"))
print(re.sub(r"\d+", add, "当前浏览量是 8808 次,200",1))

对于sub 函数 替换可以传入一个数字,表示替换几次,当然也可以传入函数名。

5, 其他

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值