正则表达式
是一组由字母和符号组成的特殊文本,可以帮助我们从某个复杂的字符串中,提取出满足我们要求的特殊文本。
用一个形象的比喻大致体会一下正则匹配的过程
。苹果相当于写的“正则表达式”,字符串相当于“水果市场”,“正则匹配的过程”就相当于拿着苹果去“水果市场”找苹果的过程,每找到一个就返回一个,否则就什么也没有。
接下来,我们看一个实例,找出所有的薪资数字:
content = ''' Python3高级开发工程师上海互教教育科技有限公司上海-浦东新区2万/月02-18满员 测试开发工程师(C++/python)上海墨鹖数码科技有限公司上海-浦东新区2.5万/每月02-18未满员 Python3高级开发工程师上海互教教育科技有限公司上海-浦东新区2万/月02-18满员测试开发工程师(C++/python)上海墨鹖数码科技有限公司上海-浦东新区2.5万/每月02 -18未满员 Python3开发工程师上海德拓信息技术股份有限公司上海-徐汇区1.3万/每月02-18剩余11人 测试开发工程师(Python)赫里普(上海)信息科技有限公司上海-浦东新区1.1万/每月e2-18剩余5人Python高级开发工程师上海行动教育科技股份有限公司上海-闵行区2.8万/月02-18剩余255人 python开发工程师上海优似腾软件开发有限公司上海-浦东新区2.5万/每月02-18满员 ''' #将文本内容按行放入列表 lines = content.splitlines() for line in lines: pos2 = line.find('万/月') #查找 万/月 在字符串中什么地方 if pos2< 0: pos2 = line.find('万/每月') #查找 万/每月 在字符串中什么地方 if pos2 <0:#都找不到 continue #跳过执行下一步 #执行到这里,说明可以找到薪资的关键字 #接下来分析 薪资 数字的起始位置 #方法事找到 pos2 前面薪资数字的位置 idx = pos2 -1 #只要事数字或者小数点,就继续往前面找 while line[idx].isdigit() or line[idx]=='.': idx -= 1 # 现在 idx 指向 薪资数字前面的那个字 # 所以薪资开始的 索引 就是 idx+1 pos1 = idx + 1 print(line[pos1:pos2])
运行一下,是完全可以的,就是还挺麻烦的,是不是?接下来我们来看下用上正则表达式后会是怎么样:
content = ''' Python3高级开发工程师上海互教教育科技有限公司上海-浦东新区2万/月02-18满员 测试开发工程师(C++/python)上海墨鹖数码科技有限公司上海-浦东新区2.5万/每月02-18未满员 Python3高级开发工程师上海互教教育科技有限公司上海-浦东新区2万/月02-18满员测试开发工程师(C++/python)上海墨鹖数码科技有限公司上海-浦东新区2.5万/每月02 -18未满员 Python3开发工程师上海德拓信息技术股份有限公司上海-徐汇区1.3万/每月02-18剩余11人 测试开发工程师(Python)赫里普(上海)信息科技有限公司上海-浦东新区1.1万/每月e2-18剩余5人Python高级开发工程师上海行动教育科技股份有限公司上海-闵行区2.8万/月02-18剩余255人 python开发工程师上海优似腾软件开发有限公司上海-浦东新区2.5万/每月02-18满员 ''' import re p = re.compile(r'([\d.]+)万/每{0,1}月') #([\d.]+)万/每{0,1}月 正则表达式的语法 for one in p.findall(content): print(one) #结果 2 2.5 2 2.5 1.3 1.1 2.8 2.5
在线验证表达式是否能正确匹配到搜索的字符串:https://regex101.com/