Python之路 – day22 python内置模块3 re模块(正则)

Python之路 – day22 python内置模块3 re模块(正则)参考博文:https://www.cnblogs.com/yuanchenqi/articles/5732581.htmlre模块(正则)就其本质而言,正则表达式(或RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过re模块实现。正则表达式模式被

大家好,欢迎来到IT知识分享网。

参考博文: Python之路 – day22 python内置模块3 re模块(正则)

re模块(正则)

  就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

  re.find( str1,str2)     将str2中所有符合str1匹配规则的,挑出来,添加进列表,并返回列表

  • str1, 第一个参数: 匹配规则
  • str2,  第二个参数: 目标字符串

  re.search(str1,str2)  str2中从前往后按照str1匹配规则搜索,找到一个匹配项后,就不在往后搜索了,即结果只会有一个匹配项。

    如果有匹配项,则返回的是一个对象,可通过该对象.group()提取 匹配的结果信息;如果没有匹配到,则返回None

 

  • str1, 第一个参数: 匹配规则
  • str2,  第二个参数: 目标字符串

 

字符匹配(普通字符,元字符):

1. 普通字符

    大多数字符和字母都会和自身匹配
              >>> re.findall(‘alvin’,’yuanaleSxalexwupeiqi’)
                      [‘alvin’]

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

import re

#1 .
ret = re.findall('a..in', 'helloalvin')  # .是通配符,即可匹配任何字符,一个.匹配一个字符
print('.通配符:',ret)  # ['alvin']

#2 ^
ret = re.findall('^a...n', 'alvinhelloawwwn')  # ^是起始符,即从目标字符串起始处查找,是否以指定字符开头
print('^起始匹配:',ret)  # ['alvin']

#3 $
ret = re.findall('a...n$', 'alvinhelloawwwn')  # $是终止符,即如果目标字符串以指定的字符串结尾,则返回匹配的字符串
print('$终止匹配:',ret)  # ['awwwn']

#----------------------------------------------------------------
#4 *
ret = re.findall('abc*', 'abcccc')  # 贪婪匹配[0,+oo]  *是重复匹配,*号用来修饰其前一个字符,代表该字符的重复个数为 0到无穷大
print("*重复匹配:",ret)  #  ['abcccc']
ret=re.findall('abc*','ertabyu')
print("*重复匹配:",ret)     # ['ab']

#5 +
ret = re.findall('abc+', 'abccc')  # [1,+oo]   +是重复匹配,+号用来修饰其前一个字符,代表该字符的重复个数为 1到无穷大
print('+重复匹配:',ret)  # ['abccc']
ret = re.findall('abc+', 'abRcd')
print('+重复匹配:',ret)  # []

#6 ?
ret = re.findall('abc?', 'abccc')  # [0,1]   ?是重复匹配,?号用来修饰其前一个字符,代表该字符的重复个数为 0或1
print('?重复匹配:',ret)  # ['abc']
ret = re.findall('abc?', 'abecc')
print('?重复匹配:',ret)  # ['ab']

# {}
# {0,} 等同于 *
# {1,} 等同于 +
# {0,1} 等同于 ?
# {n} 修饰前一个字符,代表该字符的重复匹配个数必须有 n个
# {m,n}  修饰前一个字符,代表该字符的重复匹配个数范围是 m-n (包含m,n)
ret = re.findall('abc{1,4}', 'abccc')
print(ret)  # ['abccc'] 贪婪匹配

3. 元字符之字符集[]

  3.1  字符集里[ ]里,只有 ^ 代表 \,- 代表什么;          其他的元字符,比如 . * + ? $ () ,都只是当作普通字符

  3.2  常用的 [a-z], [A-Z], [A-z], [0-9] 分别表示一个指定区间内,小写/大写/数字 形式的字符

  3.3  [ ]里,如果有多个普通字符,只是代表 的关系,即一个字符集[ ]在最终匹配的时候,只会匹配一个字符

  Python之路 - day22 python内置模块3 re模块(正则)

 

import re
# --------------------------------------------字符集[]
ret = re.findall('a[bc]d', 'eracdrrabdu')  # 字符集,[bc] 代表匹配 b或 c
print(ret)  # ['acd', 'abd']

ret = re.findall('[a-z]', 'acd')     #[a-z] 表示 匹配 a-z之间的所有小写字母。
print(ret)  # ['a', 'c', 'd']

ret = re.findall('[.*+]', 'a.cd+')   # [ ] 里的.*+ 都当普通字符处理,即匹配   .或 * 或 +
print(ret)  # ['.', '+']

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

ret = re.findall('[3-9]', '45012dha3')   # [3-9] 表示匹配 3-9之间的所有数字
print(ret)  # ['4', '5', '3']

ret = re.findall('[^ab]', '45bdha3')    # [ ]里的^ 不再是起始匹配符,而是 逻辑“非”      此例: ^表示匹配除a和b以外的任意字符
print(ret)  # ['4', '5', 'd', 'h', '3']

ret = re.findall('[\d]', '45012bdha3')     #  \d 表示匹配0-9之间的所有数字,等同于[0-9]
print(ret)  # ['4', '5', '0', '1', '2', '3']

 

4.元字符之 转义符(反斜杠) \

反斜杠 后边跟 元字符:     去除特殊功能,当普通字符处理, 比如   \.   \*    \+     \?     \\
反斜杠 后边跟 普通字符实现特殊功能,比如\d

\d  匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s  匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b  匹配一个特殊字符边界,比如 空格 ,&,#,@,$,%,& 等特殊字符

#python解释器 和 re 模块里,\都是作为转义字符处理的。所以,如果re模块,要接收一个\,在python解释器里,得有两个\\,这样,re模块才能接收到一个\
import re
ret=re.findall('I\b','I am LIST')   # \b在python里已经有特殊意义,所以,python会对\b进行处理后,再提交给re模块,所以,re模块接收到的将不再是\b,所以不能匹配到想要的结果
print(ret)  #[]

ret=re.findall(r'I\b','I am LIST') #在前面加r,表示告诉python解释器,后面的字符不用转义处理,这样re模块就能正确接收到\b
print(ret)  #['I']
ret=re.findall('I\\b','I am LIST') #一个\,有特殊意义,在\前面再加一个\,代表第二个\就是当普通字符来处理,最终提交给re模块的 就是\b,所以也能达到要求
print(ret)  #['I']

#python解释器 和 re 模块里,\都是作为转义字符处理的。所以,如果re模块,要接收一个\,在python解释器里,得有两个\\,这样,re模块才能接收到一个\
# ret=re.findall('a\l',"adfa\ldf")  # pycharm直接 标红提示
# print(ret)
# ret=re.findall('a\\l',"adfa\ldf") # pycharm直接 标红提示
# print(ret)

ret=re.findall('a\\\\l',"adfa\ldf") # '\\\\'被python解释器处理后,变成-->> '\\',提交给re模块,re模块才能正确的将目标字符串中的\匹配出来 print(ret) #['a\\l'] ret=re.findall(r'a\\l',"adfa\ldf") # 前面加 r,python解释器,直接将\\提交给re,所以,也能达到同样的效果 print(ret) #['a\\l']

 

5.元字符之分组 ( )

m = re.findall('(ad)+', 'adddddc') #()用来分组,即()里的当成一个整体
print(m)  # ['ad']

# re.search() 方法 和 re.findall() 的不同
ret = re.search('(?P<id>\d{2})/(?P<name>\w{3})', '23/comrtu')   # \w:匹配任何字母数字字符 \d: 匹配任何十进制数 ?P<**>表示别名,便于取出匹配项中的某部分 print(ret.group())  # 23/com
print(ret.group('id'))  # 23
print(ret.group('name')) # com

 注意,以下情况

import re

res=re.findall('(abc)+',"abcabcabcyyyy")  #匹配的结果是: abcabcabc,但由于存在()分组,abc当成一个整体,优先级较高,最终打印的只有一个abc
print(res) # ['abc']

res=re.findall('(?:abc)+',"abcabcabcyyyy")  #在()分组里,前面加上?:  代表取消分组优先级,将会显示所有结果
print(res)  # ['abcabcabc']

 

6.元字符之(或)

ret=re.findall('ab|c','aADaceraby')  # |两侧的当成两部分
print(ret)

 

 7.re模块 常用方法

# 3
ret=re.match('\de','rer8ea')
print(ret)  # None
ret=re.match('\de','8earer6eu')
print(ret)   #<re.Match object; span=(0, 2), match='8e'>
print(ret.group()) # 8e

# 4
ret=re.split('[-|]','A-BCD|df9')  # 同时按-和|进行分割,并返回分割后的列表
print(ret) # ['A', 'BCD', 'df9']
ret=re.split('[ab]','aerabtuy')  # 注意此例的结果 (先按照a分割,再把结果按b分割)
print(ret) # ['', 'er', '', 'tuy']

 

# 5
ret = re.sub('\d', 'abc', 'alvin5yuan6yu8', 1)   #替换 (最后一个参数是替换的次数,不填的时候,默认全部替换)
print(ret)  # alvinabcyuan6yu8    #只替换一个时,返回替换后的字符串
ret = re.subn('\d', 'abc', 'alvin5yuan6yu8')
print(ret)  # ('alvinabcyuanabcyuabc', 3) #替换多个时,返回一个元组,包含替换后的字符串,以及替换的次数

# 6
obj = re.compile('\d{3}')    #re.compile() 可以将匹配规则固定,便于大量重复使用
ret = obj.search('abc123eeee')
print(ret.group())  # 123
ret=obj.findall("rt9876yt")
print(ret)  #['987']

 

import re

# 7
ret = re.finditer('\d', 'ds3sy4784a')  #类似于findall,不过finditer的结果是一个迭代器,便于大数据量时的节省内存
print(ret)  # <callable_iterator object at 0x10195f940>

print(next(ret).group()) # 3
print(next(ret).group()) # 4

 

注意点

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

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')  #分组时,前面加上?:可以取消优先级
print(ret)  # ['www.oldboy.com']

 

 

 

 

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/27733.html

(0)
上一篇 2023-09-18 16:33
下一篇 2023-09-19 12:45

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信