'''
1. 元字符
符号 含义
. 匹配除换行以外的任意字符
^ 匹配字符串的开始位置,在[]中出现为非的意思
$ 匹配字符串的结束位置
* 匹配0次、1次或多次前面的原子
? 匹配0次或1次前面的原子
+ 匹配1次或多次前面的原子
{n} 前面的原子恰好出现n次
{n,} 前面的原子至少出现n次
{n,m} 前面的原子至少出现n次,至多出现m次
| 模式选择符
() 模式单元符,作分组:在findall 中使用,返回的参数是()中匹配的值,不会管外面其他参数
(?:reg):取消优先级,在findall中使用,会返回满足全部正则的字符,而不是返回字符的一部分(reg是变量)
(?P<name>);给分组指定name. (name是变量)
[] 字符集,里面出现的字符都只表示某一个字符,不会有转义问题
eg:
[a-z0-9A-Z] 数字,大小写字母中的一个
通用字符
符号 含义
\w 匹配任意一个字母、数字或下划线
\W 匹配除字符、数字和下划线以外的任意一个字符
\d 匹配任意一个十进制数
\D 匹配除十进制数以外的任意一个其它字符
\s 匹配任意一个空白字符
\S 匹配除空白字符以外的任意一个其它字符
\b:表示字母数字与非字母数字的边界, 非字母数字与字母数字的边界。
\B:表示字母数字与(非非)字母数字的边界,非字母数字与非字母数字的边界。
eg:匹配以a开头的字符串
str = 'adfd fdfad1a 2 a31 fda a'
pattern = r'\ba\w*\b'
print(re.findall(pattern,str))
2. 贪婪模式与懒惰模式
pattern1 = "p.*n" # 贪婪模式
pattern2 = "p.*?n" # 懒惰模式
?指定前一个数量元字符匹配次数为1(*为0-1)
3. 模式修正符
符号 含义
I 匹配时忽略字母大小写
M 多行匹配
L 做本地化识别匹配
U 根据Unicode字符及解析字符
S 使元字符"."匹配包括换行在内的所有字符
X 使存在分行符的正则表达式,也能正确匹配(目的:让表达式逻辑更清晰)
re.findall('pattern1','str',re.I)
4. RE中常用的方法(函数)
方法/属性 作用
re.match(pattern, string, flags=0) 从字符串的起始位置匹配,成功返回MatchObject 实例,失败就返回none
re.search(pattern, string, flags=0) 查找第一个成功的匹配,返回SearchObject 实例,失败就返回none
re.findall(pattern, string, flags=0) 找到RE匹配的所有字符串,并把他们作为一个列表返回
re.finditer(pattern, string, flags=0) 找到RE匹配的所有字符串,并把他们作为一个迭代器返回
re.sub(pattern, repl, string, count=0, flags=0) 替换匹配到的字符串
re.subn(pattern, repl, string, count=0, flags=0) 替换匹配到的字符串,并返回一个元组:(result,替换了几次)
re.split(pattern, string, maxsplit=0, flags=0) 根据正则,对源字符串进行切割
re.compile(pattern[, flags])
作用:把正则表达式语法转化成正则表达式对象,通过对象来调用函数
好处:
1.此函数是先编译为正则对象再来调用,因此在多次匹配时,可以减少编译次数
2.函数调用更简捷,不用再传pattern
函数参数说明:
pattern:匹配的正则表达式。
string:要匹配的字符串。
flags:标记为,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
repl:替换的字符串,也可作为一个函数。
count:模式匹配后替换的最大次数,默认0表示替换所有匹配。
maxsplit:最大切割次数
分组函数返回实例:
方法/属性 作用
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回包含所有小组字符串的元组,从1到所含的小组
groupdict() 返回以有别名的组的别名为键、以该组截获的子串为值的字典
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配(开始,结束)的位置
'''
import re
def re_object_test():
'''
类似的函数有:match()、search()…,返回值为一个对象
方法: 功能:
group() 返回 RE 匹配的字符串值
start() 返回 匹配开始的位置
end() 返回 匹配结束的位置
span() 以元组形式返回 匹配( 开始,结束 ) 的位置
'''
pattern = r"python." # 设定以 "python" 为切割标识符
string = "ABCpython2DEFpython3GHIpython4567"
result = re.search(pattern, string)
print(result.group()) # 输出匹配的内容
print(result.span()) # 输出匹配的位置信息
print(result.start()) # 输出匹配内容的 起始位置
print(result.end())
def sub_test():
'''
查找并替换
语法格式:
re.sub(pattern, repl, string, count=0, flags=0)
pattern:传入需要匹配的正则表达式。
repl:替换后的字符串
string:传入需要匹配的源字符串。
count:指定替换的个数
flags:标志位(可选参数),可传入“模式修正符”等信息。
'''
pattern = r"python."
string = "ABCpython2DEFpython3GHIpython4567"
result1 = re.sub(pattern, "java", string) # 默认替换所有
result2 = re.sub(pattern, "java", string, 2) # 替换 2 次
print(result1)
print(result2)
def split_test():
'''
语法格式:
re.split(pattern, string, maxsplit=0, flags=0)
pattern:传入需要匹配的正则表达式。
string:传入需要匹配的源字符串。
maxsplit:指定最大的切割次数
flags:标志位(可选参数),可传入“模式修正符”等信息。
'''
pattern = r"python" # 设定以 "python" 为切割标识符
string = "ABCpython2DEFpython3GHIpython4567"
result1 = re.split(pattern, string) # 全局切割
result2 = re.split(pattern, string, 2) # 只切割 2 次
print(result1)
print(result2)
def search_test():
'''
re.search(pattern, string[, flags])
返回第一个查找到的
作用:在字符串中查找匹配正则表达式模式的位置,返回 MatchObject
的实例,如果没有找到匹配的位置,则返回 None。
'''
pattern = r"(?P<name>python)(?P<t>.)"
string = "ABCpython2DEFpython3GHIpython4567"
res = re.search(pattern,string)
print(res.group('t'))
print(res.group(1))
print(res.groupdict())
print(res.span())
pass
if __name__ == "__main__":
# sub_test()
# split_test()
# re_object_test()
search_test()