第四十篇 re模块

Posted itboy-newking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四十篇 re模块相关的知识,希望对你有一定的参考价值。

re模块

import re

正则表达式,又称规则表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本(也就是原字符串中有符合规则的就拿出来,没有就继续搜索)

元字符

s = 'I am king, I amam27 years old, I want to go to study'

# 1. ^ 获取开头字符
res = re.findall('^I',s)
print(res)    # ['I']

# 2. $ 获取结尾字符
res = re.findall('study$',s)
print(res)   # ['study']

# 3. | 左右两边都输出(or),获取左右两边
res = re.findall('I am 27 years|I want to',s)
print(res)    # ['I am 27 years', 'I want to']
res = re.findall('^I|study$',s)
print(res)    # ['I', 'study']

# 4. [] 获取字符串中所有符合[]中的元素,并按顺序输出
 res = re.findall('[oldI]',s)
 print(res)   # ['I', 'I', 'o', 'l', 'd', 'I', 'o', 'o', 'o', 'd']

# 5. . 一个 . 就是获取任意一个字符
res = re.findall('...',s)   每次获取三个任意字符
print(res)    # ['I a', 'm k', 'ing', ', I', ' am', ' 27', ' ye', 'ars', ' ol', 'd, ', 'I w', 'ant', ' to', ' go', ' to', ' st', 'udy']

# 6. n就是前的一个字符复制出n次之后组成的新字符串,去原字符串中找
# 如果前的字符串只有一个字符,且中是0,则表示用""(空)去匹配
st = '我我我我我我我我我我,我你,你我我我'
res0 = re.findall('你你0',st)   # “你”
res1 = re.findall('我3',st)    # “我我我”
res2 = re.findall('你我3',st)   # “你我我我”
print(res0)   # ['你', '你']
print(res1)   # ['我我我', '我我我', '我我我', '我我我']
print(res2)   # ['你我我我']

# 7. * 匹配前面的子表达式任意次。*等价于0,。
# 例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”、“zooo”.....
st = '我我我,我我,我'
res0 = re.findall('我你*',st)  # “我”、“我你”、“我你你”......
res1 = re.findall('你*',st)   # “”、“你”、“你你”......
print(res0)    # ['我', '我', '我', '我', '我', '我']
print(res1)    # ['', '', '', '', '', '', '', '', '']  似乎与C中的字符串和字符数组有点渊源,最后一个字符可能默认是\n

# 8. +  匹配前面的子表达式一次或多次(大于等于1次)。+等价于1,
# 例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。
st = '我我你我你,我我,我'
print(re.findall('你+',st))   # ['你', '你']
print(re.findall('我你+',st))   # ['我你', '我你']
# 需要理解贪婪和非贪婪,对于这些元字符,不加?都是默认为贪婪,也就是在搜索时,会尽量用匹配前面一个字符多次的去对比原字符串
print(re.findall('我+',st))   # ['我我', '我', '我我', '我']

# 9. ? 匹配前面的子表达式0次或1次.停止符
st = '我我你我你,我我,我,我你他'
print(re.findall('我?',st))  # ['我', '我', '', '我', '', '', '我', '我', '', '我', '', '我', '', '', '']

# 当 ? 字符紧跟在任何一个其他限制符(*,+,?,n,n,,n,m)后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串;而默认的贪婪模式则尽可能多地匹配所搜索的字符串。
# 例如,对于字符串“oooo”,“o+”将尽可能多地匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少地匹配“o”,得到结果 ['o', 'o', 'o', 'o']

# 10. \d 匹配数字
stri = 'i am 26 years old'
print(re.findall('\d',stri))   # ['2', '6']

#11. \D  匹配非数字
stri = 'i am 26 years old'
print(re.findall('\D',stri))   # ['i', ' ', 'a', 'm', ' ', ' ', 'y', 'e', 'a', 'r', 's', ' ', 'o', 'l', 'd']

# 12. \w 匹配包括下划线的任何单词字符
st = '我我你_我你,我%我,我,我你他'
print(re.findall('\w',st))  # ['我', '我', '你', '_', '我', '你', '我', '我', '我', '我', '你', '他']
 
# 13 \W 非字母,数字,下划线
print(re.findall('\W',st))   # [',', '%', ',', ',']

# 14 \s 空
print(re.findall('\s',st))  # []

# 15. \S 非空
print(re.findall('\S',st))  # ['我', '我', '你', '_', '我', '你', ',', '我', '%', '我', ',', '我', ',', '我', '你', '他']

res = re.findall('^I.*?study$',s)
print(res)    ['I am king, I am 27 years old, I want to go to study']

# 16. (.*?) 非贪婪模式,找到一个了就停止
# 贪婪模式  .*
s = '孙悟空找猪八戒找媳妇妇妇高[email protected]@@@翠兰,然____后asdfasdf吃西234234瓜,再吃   西瓜妇'
res = re.findall('猪.*妇',s)
print(res)   # ['猪八戒找媳妇妇妇高[email protected]@@@翠兰,然____后asdfasdf吃西234234瓜,再吃   西瓜妇']
# 非贪婪模式
res = re.findall('猪.*?妇',s)
print(res)   # ['猪八戒找媳妇']

# 17. re.compile  写一个通用的规则(要用到前面学到的元字符)
s = 'i am 173'
form1 = re.compile('\d')
form2 = re.compile('\D')

res1 = form1.findall(s)
res2 = form2.findall(s)

print(res1)   # ['1', '7', '3']
print(res2)   # ['i', ' ', 'a', 'm', ' ']

# 18. match和search

# re.match从头开始匹配,找一个,如果在开头没有则返回None
s = '从前有座山,山里有个庙'
res = re.match('有',s)
print(res)    # None
s = '有座山,有座庙'
res = re.match('有',s)
print(res)   # <_sre.SRE_Match object; span=(0, 1), match='有'>

# re.search 搜索所有
s = '从前有座山,山里有个庙'
res = re.search('有',s)
print(res)   # <_sre.SRE_Match object; span=(2, 3), match='有'>

# 19. 分组,需要的数据放入()就行了,括号外的就不会打印了
s = '有踢球的,有跑步的,有看书的,'
res = re.findall('有(.*?),',s)
print(res)   # ['踢球的', '跑步的', '看书的']

# 20. re.split  与字符串的相似,只是里面的参数用正则表达式
s = 'i am 26 years old'
res = re.split('\d',s)
print(res)   # ['i am ', '', ' years old']

#21. sub 和 subn

# 和字符串中的replace相似,subn会计算替换的次数
s = '昨天是1号,今天是2号,明天3号,后天4号放假'

# re.sub
sub_res = re.sub('\d','*',s)
print(sub_res)   # 昨天是*号,今天是*号,明天*号,后天*号放假

# re.subn
subn_res = re.subn('\d','*',s)
print(subn_res)   # ('昨天是*号,今天是*号,明天*号,后天*号放假', 4)

以上是关于第四十篇 re模块的主要内容,如果未能解决你的问题,请参考以下文章

第四十篇 Numpy.array的基本操作——向量及矩阵的运算

第四十篇 Python之设计模式总结-简单工厂工厂方法抽象工厂单例模式

python学习第四十八天json模块与pickle模块差异

第四十七节,random 随机数模块

python第四十三天--第三模块考核

python第四十九天--paramiko模块安装大作战