python课堂整理28----re模块

一、正则(re)

就其本质而言,正则表达式(或re)就是一种小型的、高度专业化的编程语言,它内嵌在python中,并通过re模块实现。

正则表达式模式被编译成一系列的字节码,然后由用c语言编写的匹配引擎执行。

用途:模糊匹配

元字符:. ^ $ * + ? {} [] |  () \

♦通配符 ‘ . ’(除\n以外都可以代替)

一个点代表一个其它任意字符

两个点代表2个字符

<以下程序都是在pycharm交互环境下运行>

findall 会匹配所有内容,符合条件的都返回到一个列表

import re
re. findall("a..x", "asdasdxdf")
[‘asdx‘]

♦ ^ :以...开头(只能在开头匹配)

re.findall("^a..x", "adsxdfdfhu")
[‘adsx‘]

重复符:* + ? {}

♦ * :匹配(0,+00)次  属于贪婪匹配

re.findall("alex*", "asdsadalexxx")
[‘alexxx‘]
re.findall("alex*", "asdsadale")
[‘ale‘]

♦ + :匹配(1,+00)次  (+号前的字符必须出现一次,才能匹配到)属于贪婪匹配

re.findall("alex+", "asdsadalexxx")
[‘alexxx‘]
re.findall("alex+", "asdsadale")
[]    #空列表表示没有匹配到

♦ ?:匹配(0, 1)次

re.findall("alex?", "asdsadalexxx")
[‘alex‘]
re.findall("alex?", "asdsadale")
[‘ale‘]

♦ { }

{0,} == *

{1, } == +

{0,  1} == ?

{n}: 重复n次

{1,n} :重复1 - n次 (1和n 之间只用逗号,不要用空格)

{1,n} :重复1 - n次 (1和n 之间只用逗号,不要用空格)

{0,n} :重复0 - n次 (0和n 之间只用逗号,不要用空格)

re.findall("alex{6}", "asdbhalexx")
[]
re.findall("alex{6}", "asdbhalexxxxxx")
[‘alexxxxxx‘]

re.findall("alex{1,6}", "asdbhalexxx")
[‘alexxx‘]

♦惰性匹配: *  +  加上 ?

re.findall("alex*?", "asdasdalexxx")  #匹配0次
[‘ale‘]
re.findall("alex+?", "asdasdalexxx")  #匹配1次
[‘alex‘]

♦字符集 [ ]

在字符集里有功能的符号  - ^ \

在字符集除了上面三个符号,没有别的特殊功能符号

re.findall("x[yz]", "xyuuuu")
[‘xy‘]
re.findall("x[yz]", "xyuxzu")
[‘xy‘, ‘xz‘]
re.findall("www[baidu]", "wwwbaidu")
[‘wwwb‘]
re.findall("x[yz]p", "xypuuxzpuzyzp")
[‘xyp‘, ‘xzp‘]
re.findall("x[y,z]p", "xypuuxzpux,p")  #逗号当普通字符处理
[‘xyp‘, ‘xzp‘, ‘x,p‘]
re.findall("x[y*z]p", "xypuuxzpux*p")  #星号当普通字符处理
[‘xyp‘, ‘xzp‘, ‘x*p‘]

♦ - :

[A-Z]:表示A到Z的其中一个

[a - z]:表示a到z的其中一个

re.findall("q[a-z]", "qu")  #a - z的其中一个
[‘qu‘]
re.findall("q[a-z]", "quo")
[‘qu‘]
re.findall("q[a-z]*", "quosdsa")  #重复中括号里的内容匹配
[‘quosdsa‘]
re.findall("q[a-z]+", "quosdsa")
[‘quosdsa‘]
re.findall("q[0-9]", "qsdfdasf8")  # 0- 9中的其中一个
[]
re.findall("q[0-9]*", "qsdfdasf8")
[‘q‘]
re.findall("q[0-9]*", "q9sdfdasf8")
[‘q9‘]
re.findall("q[0-9]*", "q9235345sdfdasfq8")
[‘q9235345‘, ‘q8‘]

♦ ^放到 [ ] 中表示非

re.findall("q[^a-z]", "q123") #匹配只要不是a- z
[‘q1‘]
re.findall("q[^a-z]", "qzsd")
[]
re.findall("\([^()]*\)", "12+(34*6+2-5*(2-1))")
[‘(2-1)‘]

元字符之转义字符 \

反斜杠后跟元字符去除特殊功能,比如 \.

反斜杠后跟普通字符实现特殊功能,比如\d

\d 匹配任何十进制数;它相当于类[0 - 9]

\D 匹配任何非数字字符;它相当于类[^0-9]

\s匹配任何空白字符;它相当于类[\+\n\r\f\v]

\S匹配任何非空白字符;它相当于类[^\+\n\r\f\v]

\w匹配任何字母数字字符;它相当于类[a-zA-Z0-9]

\W匹配任何非字母数字字符;它相当于类[^a-zA-Z0-9] 

\b 匹配一个特殊字符边界,比如空格,&,#等

例:

re.findall("\d","12 + (34*6+2-5*(2-1))" )
[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘6‘, ‘2‘, ‘5‘, ‘2‘, ‘1‘]
re.findall("\d+","12 + (34*6+2-5*(2-1))" )
[‘12‘, ‘34‘, ‘6‘, ‘2‘, ‘5‘, ‘2‘, ‘1‘]
re.findall("www.baidu","www.baidu" )
[‘www.baidu‘]
re.findall("www.baidu", "www\nbaidu")
[]
re.findall("www\.baidu","www.baidu" )
[‘www.baidu‘]
re.findall("www*baidu", "www*baidu")
[]
re.findall("www\*baidu", "www*baidu")
[‘www*baidu‘]

 \在python和re环境中都有转义的意义,而下面需要的是普通的斜杠加b,所以得用原生的\,此时前面加 r 或再加个斜杠

r" " 后面的内容就是原生内容,不做任何转义

re.findall("I\b", "hello I Love Ilex")
[]
re.findall(r"I\b", "hello I Love Ilex")  #取后面有空格的那个I
[‘I‘]
re.findall("I\\b", "hello I Love Ilex")
[‘I‘]

特殊的四斜杠:

因为\在re和python中都有转义作用,要得到re中的\l,则需要\\l  而先经过python环境就需要两个\\去转义re需要的两个\\,所以变成4个斜杠

re.findall("c\\\\l", "abc\lerwt") #匹配c\l
[‘c\\l‘]
re.findall(r"c\\l", "abc\lerwt") #匹配c\l
[‘c\\l‘]

♦ | :或

re.findall("ka|b", "asdkasf")
[‘ka‘]
re.findall("ka|b", "asdkabsf")
[‘ka‘, ‘b‘]
re.findall("ka|b", "asdkbsf")
[‘b‘]
re.findall("ka|b", "asdkbsf")
[‘b‘]
re.findall("ka|b", "asdka|bsf")
[‘ka‘, ‘b‘]
re.findall("ka|bc", "asdka|bsf")
[‘ka‘]
re.findall("ka|bc", "asdka|bcsf")
[‘ka‘, ‘bc‘]

♦()分组

re.findall("(abc)+","abcccccccccc")
[‘abc‘]

findall :把字符串里所有能匹配的内容放到一个列表

search :找到一个满足条件的就不找了, 匹配成功返回一个对象,用 .group()取值

re.search("[a-z]+", "alex34asd19").group()
‘alex‘

(?P<组名>正则):分组

re.search("(?P<name>\w+)", "alex34").group()
‘alex34‘

想单独取alex,则:

re.search("(?P<name>[a-z]+)\d+", "alex34asd19").group()
‘alex34‘
re.search("(?P<name>[a-z]+)\d+", "alex34asd19").group("name")
‘alex‘
re.search("(?P<name>[a-z]+)(?P<age>\d+)", "alex34asd19").group("age")
‘34‘

  

  

 

 

 

  

  

原文地址:https://www.cnblogs.com/dabai123/p/11368907.html

时间: 2024-11-09 02:13:13

python课堂整理28----re模块的相关文章

python课堂整理26 ---json、pickle、shelve模块(序列化处理)

一.序列化 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,python中叫pickling 序列化之后就可以把序列化后的内容写入磁盘或通过网络传输到别的机器上 反序列化:unpickling,也就是loads的过程 二.json模块 功能:处理成字符串 可以让不同语言间进行数据交换 import json dic = {"name": "alex"} data = json.dumps(dic) print(data, type(data)) 经js

python课堂整理31----configparser模块

一.功能:为配置文件开发 创建一个配置文件: import configparser config = configparser.ConfigParser() config["DEFAULT"] = { "ServerAliveInterval": '45', 'Compression': 'yes', 'CompressionLevel':'9' } config['bitbuckket.org'] = {} #创建一个空字典 config['bitbuckket

python课堂整理23----模块介绍

一.模块 概念:一个 .py文件就被称之为一个模块 分三类:•python标准库 •第三方模块 •应用程序自定义模块 例图中的study1.py称为执行文件,一般命名为 bin.py  , cal.py称为被调用文件,里面一般写功能代码 二.模块的调用方式: import的作用: ①执行对应的文件(先把调用文件执行一遍) ②引入变量名 导入方式: import <模块名>(as  别名) from <模块名> import <函数名>(as 别名) from <模

python课堂整理33----面向对象(我的对象又在哪里)

一.面向对象设计(Object Oriented Design) 将一类具体事物的数据和动作整合到一起,即面向对象设计 理解两个概念: 类:把一类事物的相同的特征和动作整合到一起就是类,类就是一个抽象的概念 对象:就是基于类而创建的一个具体的事物(具体存在的),也就是特征和动作整合到一起 例: def people(gender,country): #定义一个“人”的类 def init(gender, country): #相当于初始化 dir = { #人的特征和动作 "gender&quo

python课堂整理4---列表的魔法

一.list   类, 列表 li = [1, 12, 9, "age", ["大白", "小黑"], "alex"] 1. 中括号括起来 2. 逗号分割每个元素 3. 列表中的元素可以是数字.字符串.列表.布尔值等 4. 索引取值 5. 切片取值---->得到的还是列表 6. for循环 7. while 循环 8. 支持 in 操作 列表在内存中是以链表形式存储,可以被修改 二.列表灰魔法 1.修改 li = [1,

python课堂整理16---内置函数

1. abs :求绝对值 print(abs(-1)) 2. all()传入一个可迭代对象,对该对象进行bool值运算,若都为True 就返回True,有一个为假,就返回False print(all([12,'asds',345])) print(all('')) #特例 若参数为空也返回True print(all((0,))) print(all([])) 3. any () 和all()相反,只要有一个为真就返回Ture print(any([1231, 0])) print(any([

python课堂整理3---字符串魔法

字符串魔法 1.首字母大写功能 test = "alex" v = test.capitalize() print(v) 2.所有变小写(casefold更厉害,可以将很多未知的其他国家字符变小写) test = "ALex" v1 = test.casefold() print(v1) v2 = test.lower() print(v2) 3.设置宽度,并将内容居中,20代指总长度,*为空白位置填充一个字符,可有可无. test = "alex&quo

python课堂整理5---元组

一.元组   Tuple tu = (111, 22, 33, "alex", (11,22), [(33, 44)], True, ) 元组元素不可被修改,不能被增加或删除 一般写元组的时候,推荐在最后加入“ , ” 支持索引取值 支持切片取值 可被 for 循环,是可迭代对象 #字符串转元组 s = "dabai" v = tuple(s) print(v) 用同样的方法,列表也可以转换为元组,元组也可以转换为列表 如果元组里只有字母,可以用join方法组合为新

python课堂整理7---集合

前面小节: sep 用来控制每个元素间的间隔符号 print("alex", "dabai", "liu", sep = "") 按可变不可变: 1.可变:列表,字典 2.不可变:字符串, 数字, 元组 修改了变量的值,而id号跟着改变,即不可变类型 name = 'alex' print(id(name)) name = 'sb' print(id(name)) 按访问顺序: 1.顺序访问:字符串, 列表, 元组 2.映射: