正则表达式-学习小结
3个月没看之前的代码,回过头来一瞅,这还是自己写的代码吗?一脸懵,尤其是正则表达式这种相对较为晦涩的语言,记录一下曾经使用过的那些正则表达式。当时学习正则表达是主要是要提取一些非结构化文本中的信息,期望将其能够结构化,即提取需求字段。
正则表达式的表达式全集以及常用正则表达式可参照该链接(目前见过最简洁的正则表达式全集):http://tool.oschina.net/uploads/apidocs/jquery/regexp.html 对照该链接看之前写过的正则表达式就相对一目了然。
1. 导入re库
import re
2. re.search(reg, text)
根据匹配模式查找相应的字符串
text = "当山峰没有棱角的时候 当河水不再流 当时间停住日夜不分 当天地万物化为虚有"
# 匹配text中的“当”字
reg = "当(.*)"
re_search = re.search(reg, text)
# 查找结果
res = re_search.group()
# 结果为:当山峰没有棱角的时候 当河水不再流 当时间停住日夜不分 当天地万物化为虚有
# 匹配text中的“当”字,遇到下一个“当”字停止
reg = "当([^当]*)"
g_search = re.search(reg, text).group()
print(g_search)
# 结果为:当山峰没有棱角的时候
3. re.split() / re.sub() / re.finditer()
text_ = re.split(" ", text)
# 结果为:['当山峰没有棱角的时候', '当河水不再流', '当时间停住日夜不分', '当天地万物化为虚有']
# 匹配text中的所有“当”字,并且按照list存储信息
reg = "当([^当]*)"
# 将text中的空格替换成空字符串
text = re.sub(" ", "", text)
f_search = re.finditer(reg, text)
res = []
for dang_ in f_search:
res.append(dang_.group())
print(res)
# 结果为:['当山峰没有棱角的时候', '当河水不再流', '当时间停住日夜不分', '当天地万物化为虚有']
4.正/反向肯定预查
正向肯定预查:表示沿着从左到右的顺序进行匹配
反向肯定预查:表示沿着从右到左的顺序进行匹配
# 非获取匹配
reg = "(当)(?=山峰)([^当]*)" # 正向肯定预查
reg_1 = "(当)(?:山峰)([^当]*)"
g_search = re.search(reg, text).group()
# 结果为: 当山峰没有棱角的时候
# 使用group获取匹配的group的时候从1开始计数,0或者不填写都表示匹配的所有字符串
g_search = re.search(reg, text).group(2)
# 结果为: 山峰没有棱角的时候
g_search = re.search(reg_1, text).group(2)
# 结果为: 没有棱角的时候
reg = "(?<=山峰)([^当]*)" # 反向肯定预查
g_search = re.search(reg, text).group()
# 结果为: 没有棱角的时候
reg = "(当)(?!山峰)(.*)" # 正向否定预查
g_search = re.search(reg, text).group()
# 结果为: 当河水不再流当时间停住日夜不分当天地万物化为虚有
5. text.find() / text.rfind()
# 获取某个字符在字符串中第一次出现的索引值
find_c = "不"
print(text.find(find_c)) # 13
# 反向获取某个字符第一次出现的索引值
print(text.rfind(find_c)) # 23