正则表达式与Python中的re模块常用方法

230 阅读4分钟

正则表达式

正则表达式是利用一系列的规则找出符合其规律的字符串
re模块是python中供正则表达式应用的一个模块

预定义字符

用于指定匹配的类型

\d:匹配所有的十进制数字 0-9
\D:匹配所有的非十进制数字,包括下划线
\s:匹配所有的空白字符(空格、TAB等)
\S:匹配所有的非空字符,包括下划线 \w:匹配所有的汉字、字母、数字 a-z A-Z 0-9
\W:匹配所有的非字母、汉字、数字,包括下划线

不难得出的是,当你想对一个匹配逻辑取反的时候,就把它们换成自己的大写形式

示例:

import re
res = re.findall('\w', 'aAbc123_*()-=')    # 正则表达式会从字符串第一个元素开始比对,符合则放入findall返回的列表中,并从符号的字符串后的第一个字符继续开始进行匹配判断
print(res)

特殊字符

用于在某位置匹配字符

$:匹配一行的结尾(必须放在正则表达式最后面)
^:匹配一行的开头(必须放在正则表达式最前面)

示例:

# 匹配某一字符串开头
print(re.findall('\Ahello', 'hello,world!'))
print(re.findall('^he', 'hello,world!'))
# # 匹配某一字符串结尾
print(re.findall('ld!\Z', 'hello,world!'))
print(re.findall('ld$', 'hello,world!   would  ld'))
输出结果:
['hello']
['he']
['ld!']
['ld']

当^与$混用相当于限定了字符串的内容,比如:

print(re.findall('^hello$', 'hello'))    # 限制匹配的字符只能为'hello'

重复匹配

用于限定可匹配字符的出现次数

.:匹配/代替除了\n之外任意一个字符(使用re.DOTALL方法可以使得.也可以匹配\n),性格贪婪
*:左侧字符重复0次到无穷次则匹配,性格贪婪
+:左侧字符重复1次到无穷次则匹配,性格贪婪
?:左侧字符重复0次或1次则匹配,性格贪婪
{n,m}:左侧字符重复n到m次,会尽力拿多即匹配的是最大次数,性格贪婪
{n}:代表拿n次
[]:匹配一个指定的字符,[]内放的字符即为要匹配的字符,[]内可以用-连接两个字符表示一个范围

什么是性格贪婪咧?即能拿就拿,能拿多少拿多少,一定拿到匹配规则中允许的最大值

示例:

print(re.findall('h...d', 'hello,world! HELLOWORLD hlkjd h\nd',re.DOTALL))
print(re.findall('ab*', 'abbb a ab bbb '))
print(re.findall('ab+', 'abbb a ab bbb '))
print(re.findall('ab?', 'abbb a ab bbb '))
print(re.findall('ab{2,5}', 'abbb a ab bbb abbbbbbbbb abbbbbbb'))
print(re.findall('a[0-2]b', 'a1b a3b aXb a b a\nb',re.S))    # re.S == re.DOTALL
输出结果:
['hlkjd']
['abbb', 'a', 'ab']
['abbb', 'ab']
['ab', 'a', 'ab']
['abbb', 'abbbbb', 'abbbbb']
['a1b']

re模块常用方法

方法compile()

用于编译正则表达式;
使用格式:compile(source, filename, mode[, flags[, dont_inherit]]) #返回表达式执行结果
参数:
source -- 字符串或者AST(Abstract Syntax Trees)对象
filename -- 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值
mode -- 指定编译代码的种类;可以指定为 exec, eval, single
flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象 flags和dont_inherit是用来控制编译源码时的标志

方法match()

用于在字符串中匹配正则表达式,如果匹配成功则返回MatchObject对象实例;
使用格式:re.match(pattren, string, flags=0)
参数:
pattern: 匹配的正则表达式;
string:要匹配的字符串;
flags: 标志位,用于控制正则表达式的匹配方式,例如是否区分大小写、多行匹配等
函数从头开始匹配,如果不是起始位置匹配成功的话,match函数的匹配结果就为none

import re
print(re.match('www', 'www.baidu.com').span())            # 在起始位置进行匹配
print(re.match('net', 'www.baidu.com'))                   # 不在起始位置匹配

方法findall()

用于在字符串中查找所有符合正则表达式的字符串,并返回这些字符串的列表
使用格式:findall(pattern, string, flags=0)

import re
test = '123456,身高:171;体重;140;学号:123456;密码456789;123456;123-456;barbar;13999'
print(re.findall(r'[高]', test))
print(re.findall(r'\d+', test))             
# 打印出所有数字,‘+’的含义为允许被选中的字符串中的数字可以多次出现,直至一个非元字符代表的符号出现
print(re.findall(r'\d{1,4}', test))                         # 匹配有1-4个数字的字符串
print(re.findall(r'\d{3}-\d{3}', test))                     # 匹配3个数字-3个数字的字符串  即有两个子模式
print(re.findall(r'^1\d{4}', test))                         # ^表示只在字符串的开头找匹配对象
print(re.findall(r'(\w{3})(\1)', test))                     
# (\1)表示再匹配一个与之前各组中的第一组中的匹配模式相同的字符串,返回的结果会被分成两部分,但为一个元组
print(re.findall(r'\d$1', test))

以上内容若有不正之处,恳请您不吝指正!