进阶正则表达式
JavaScript正则进阶之路——活学妙用奇淫正则表达式
Python正则表达式库:
Python菜鸟教程
对几个较难的说明一下:
①[…]表示字符集,字符可以逐个给出,也可以给范围(如 a-z, 1-9),但是[^abc]表示取反,且所有的特殊字符在字符集中都失去其原有的特殊含义
② \w的范围在设定了ascii 下是 [a-zA-Z0-9] ,但是在python re模块中,\w就是代表非标点符号
③.? /+? ?? 会使 + ? {m,n}变成非贪婪,即匹配短的优先
④ (…)分组,表达式作为一个整体,被进行编号,但是 (?:…) 表示不分组,即不能用 \1 进行引用,只用来作为整体使用
⑤ (?!..) 后面不为…,没有 =
⑥(?<=…) 和 (?<!..) 表示前向匹配和不匹配
⑦如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以使用 re.compile() 预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:
⑧年/月/日更严格的一种匹配方式是: re.compile(r'([0-9]{2}|[0-9]{4})\/(0[1-9]|1[0-2]|[1-9])\/(1[0-9]|2[0-9]|3[01])')
核心函数模块
# 1.compile(正则字符串)将正则表达式字符串转换成正则表达式对象
# 转换成正则表达式对象后,可以通过对象调用相关的方法
re_obct = re.compile(r'\w{6,12}')
print(re_obct.fullmatch('esfrsedr'))
print(re.fullmatch(r'\w{6,12}', 'esfrsedr'))
# 2.fullmatch(正则表达式,字符串)完全匹配,从字符串开头匹配到结尾
# 返回值是匹配对象,如果匹配失败返回None
match = re.fullmatch('\w{3}', 'h3s')
print(match)
# a.获取匹配到的结果
print(match.group())
# b.获取匹配到的范围
print(match.span())
# c.获取匹配到的开始的下标和结束下标
print(match.start(), match.end())
# d.获取匹配到的字符串(原字符串)
print(match.string)
# 应用:判断一个字符串是否是某种字符串(判断账号、密码是否符合要求等)
# 3.match(正则表达式,字符串)不完全匹配,从字符串开头匹配,匹配到正则表达式对应的范围为止
# 返回值是匹配对象,如果匹配失败返回None
match = re.match('\w{3}', 'h3strvsdc')
print(match)
print(match.group())
print(match.string)
# 应用:判断一个字符串是否以某种字符串开头
# 4.search(正则表达式,字符串)在指定的字符串找到某种字符串(以正则表达式来描述)
print(re.search(r'\d{2,}[a-z]', 'fhuefh45t454uhuh435--dff4u'))
# 应用:判断一个字符串中是否包含某种字符串
# 5.findall(正则表达式,字符串)去获取指定字符串中满足正则条件的所有字符串
# 返回值是列表,列表中是符合要求的字符串。没有满足要求的字符串就返回[]
result = re.findall(r'[a-z](\d+)', '123fdgv2324dfg')
print(result)
# 注意:在通过正则表达式获取子串的时候,可以通过正则表达式中添加括号,来约束获取的内容(只捕获括号中匹配到的内容)
# 匹配的时候还是按原正则表达式去查找
# 应用:字符串提取
# 6.finditer(正则表达式,字符串)用法和findall一样,只是返回值的类型不一样
# 返回一个迭代器
# 注意:()捕获部分无效
result = re.finditer(r'[a-z](\d+)', '123fdgv2324dfg')
for math in result:
print(match)
# 7.split(正则表达式,字符串)按正则表达式匹配到的字符串进行切割
# 返回值是列表,列表元素就是切割后被分段的字符串
result = re.split(r'\d+', 'ef234guyhg65yug3u4g')
print(result)
# 8.(正则表达式,repl,字符串)在原字符串中查找符合正则的子串,替换成repl
"""将指定字符串中所有‘sb'替换成'*'"""
str1 = '你好sb,你全家都是sb'
result = re.sub(r'sb', '*', str1)
print(result)