模块-正则模块:re

re模块

正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

re模块不是内置的,是属于标准库的,创建模块不要与标准库模块名重名,容易发生冲突

常用匹配模式(元字符):

模块-正则模块:re

re.findall('正则表达式','字符串') # 找所有符合的内容

import re

print(re.findall('l', 'hello'))  #找所有的 l
# ['l', 'l']
print(re.findall('\w', 'hello _/*-+ world'))  # 匹配字母、数字、下划线
# ['h', 'e', 'l', 'l', 'o', '_', 'w', 'o', 'r', 'l', 'd']
print(re.findall('\W', 'hello _/*-+ world'))  # 匹配非字母、数字、下划线
# [' ', '/', '*', '-', '+', ' ']
print(re.findall('\s', 'hello _/\r*\f-\t+\n world'))  # 匹配任意空白字符,等价于[\t,\n,\f,\r]
# [' ', '\r', '\x0c', '\t', '\n', ' ']
print(re.findall('\S', 'hello _/\r*\f-\t+\n world'))  # 匹配任意非空白字符
# ['h', 'e', 'l', 'l', 'o', '_', '/', '*', '-', '+', 'w', 'o', 'r', 'l', 'd']
print(re.findall('\d', 'he1l3l2o4'))  # 匹配任意数字【1-9】
# ['1', '3', '2', '4']
print(re.findall('\D', 'he1l3l2o4'))  # 匹配任意非数字
# ['h', 'e', 'l', 'l', 'o']

^ $ \A \Z

import re

print(re.findall('^egon','eogn egon eglheon hlegon')) # ^ :只找开头  []

print(re.findall('^egon','egon egon eglheon hlegon')) # ^ :只找开头  ['egon']

print(re.findall('egon$','egon egon eglheon hlegon')) # ^ :只找末尾  ['egon']

print(re.findall('^egon','''egon
egon
eglheon
hlegon''',re.MULTILINE)) # ^ :换行模式 ,只找开头 ['egon', 'egon']

print(re.findall('egon$','''egon
egon
eglheon
hlegon''',re.MULTILINE)) # ^ :换行模式 ,只找末尾 ['egon', 'egon', 'egon']

print(re.findall('\Aegon','''egon
egon
eglheon
hlegon''',re.MULTILINE)) # ^ :无视换行模式 ,只找开头 ['egon']

print(re.findall('egon\Z','''egon
egon
eglheon
hlegon''',re.MULTILINE)) # ^ :无视换行模式 ,只找末尾 ['egon']

^ 
指定匹配必须出现在字符串的开头或行的开头。

\A 
指定匹配必须出现在字符串的开头(忽略 Multiline 选项)。

$ 
指定匹配必须出现在以下位置:字符串结尾、字符串结尾的 \n 之前或行的结尾。

\Z 
指定匹配必须出现在字符串的结尾或字符串结尾的 \n 之前(忽略 Multiline 选项)。

重复匹配: . 分隔 * 分隔 ? 分隔 .* 分隔 .*? 分隔 + 分隔 {n,m} 分隔[ ]

# .  匹配除去换行\n的所有字符  调用re.DOTALL能匹配所有字符,包括换行\n
print(re.findall('a.b','abd acb aab a\nb aebd'))  # ['acb', 'aab', 'aeb']
print(re.findall('a.b','abd acb aab a\nb aebd',re.DOTALL))  # ['acb', 'aab', 'a\nb', 'aeb']

# * 左边那一个字符出现0次到无穷次
print(re.findall('as*','ass asss assss bcsssassss')) # ['ass', 'asss', 'assss', 'assss']

# ?:左边那一个字符出现0次或者1次
print(re.findall('ab?','abc acb abb dba dab'))  # ['ab', 'a', 'ab', 'a', 'ab']

# +:左边那一个字符出现1次到无穷次
print(re.findall('ab+','ab abb a acb abba'))  #  ['ab', 'abb', 'abb']

# {n,m}:左边那一个字符出现n次或m次
print(re.findall('ab{1,3}','a  abbb abbbb acb abc '))  # ['abbb', 'abbb', 'ab']# 
# {0,} 等同于* 
# {0,1} 等同于?
# {1,} 等同于+

# [] 代表匹配一个字符,该字符可以是指定的字符
print(re.findall('a[0-9]c','a2b a2c a1c bac a c'))   # ['a2c', 'a1c']

#.*默认为贪婪匹配 只要是范围内全要
print(re.findall('a.*b','abcaaaaacebdlkdbjfback')) # ['abcaaaaacebdlkdbjfb']

#.*?为非贪婪匹配:推荐使用 ,只取到第一个区间范围
print(re.findall('a.*?b','abcaaaaacebdlkdbjfback')) # ['ab', 'aaaaaceb']

#\# print(re.findall('a\\c','a\c')) #对于正则来说a\\c确实可以匹配到a\c,但是在python解释器读取a\\c时,会发生转义,然后交给re去执行,所以抛出异常
print(re.findall(r'a\\c','a\c')) #r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
print(re.findall('a\\\\c','a\c')) #同上面的意思一样,和上面的结果一样都是['a\\c']

#():分组
print(re.findall('company|companies','Too many companies have gone bankrupt, and the next one is my company'))
#  ['companies', 'company']
print(re.findall('compan(y|ies)','Too many companies have gone bankrupt, and the next one is my company'))
#  ['ies', 'y']
上一篇:linux学习day20笔记


下一篇:day06 数据类型