Python中的正则表达式(一)

在Python中,正则表达式是一种用于匹配和操作字符串的强大工具。正则表达式由一系列字符和特殊字符组成,用于定义搜索模式。

在Python中,我们使用内置的 re 模块来操作正则表达式。要使用正则表达式,我们首先需要导入 re 模块。

下面是一些常用的正则表达式的定义:

  • .:匹配任意字符(除了换行符)。

  • \d:匹配任意一个数字字符。

  • \D:匹配任意一个非数字字符。

  • \w:匹配任意一个字母数字字符(包括下划线)。

  • \W:匹配任意一个非字母数字字符。

  • \s:匹配任意一个空白字符(包括空格、制表符、换行符等)。

  • \S:匹配任意一个非空白字符。

  • []:定义字符集,可以匹配其中的任意一个字符。例如,[abc] 匹配字符 abc

  • [^]:在字符集中的开头使用 ^,表示取反。例如,[^abc] 匹配除了字符 abc 之外的任意一个字符。

  • *:匹配前一个字符的零个或多个出现。例如,a* 匹配零个或多个字符 a

  • +:匹配前一个字符的一个或多个出现。例如,a+ 匹配一个或多个字符 a

  • ?:匹配前一个字符的零个或一个出现。例如,a? 匹配零个或一个字符 a

  • {n}:匹配前一个字符的 n 个出现。例如,a{3} 匹配连续出现三个字符 a

  • {m,n}:匹配前一个字符的 m 到 n 个出现。例如,a{2,4} 匹配连续出现两个到四个字符 a

  • ():定义分组,用于对匹配的字符进行分组或提取。

案例分析

一个文本文件里面存储了 一些市场职位信息,格式如下所示

go 复制代码
Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员
测试开发工程师(C++/python) 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员
Python3 开发工程师 上海德拓信息技术股份有限公司上海-徐汇区1.3万/每月02-18剩余11人
测试开发工程师(Python) 赫里普(上海)信息科技有限公司上海-浦东新区1.1万/每月02-18剩余5人
Python高级开发工程师 上海行动教育科技股份有限公司上海-闵行区2.8万/月02-18剩余255人
python开发工程师 上海优似腾软件开发有限公司上海-浦东新区2.5万/每月02-18满员

现在,我们需要写一个程序,从这些文本里面抓取所有职位的薪资。

要获取这样的结果

怎么做?大家先自己思考一下。

这是典型的字符串处理。分析这里面的规律,可以发现,薪资的数字后面都有关键字 万/月 或者 万/每月,根据我们学过的知识,我们不难写出下面的代码

go 复制代码
content = '''
Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员
测试开发工程师(C++/python) 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员
Python3 开发工程师 上海德拓信息技术股份有限公司上海-徐汇区1.3万/每月02-18剩余11人
测试开发工程师(Python) 赫里普(上海)信息科技有限公司上海-浦东新区1.1万/每月02-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])

运行一下,发现完全可以。在你高兴完之后,我们再看看写的代码。怎么样?

太麻烦了,是不是。为了从每行获取薪资对应的数字,我们可是写了不少行代码。这种从字符串中搜索出某种特征的子串有没有更简单的方法呢?

解决方案就是我们今天要介绍的 正则表达式 。

go 复制代码
如果我们使用正则表达式,代码可以这样
content = '''
Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员
测试开发工程师(C++/python) 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员
Python3 开发工程师 上海德拓信息技术股份有限公司上海-徐汇区1.3万/每月02-18剩余11人
测试开发工程师(Python) 赫里普(上海)信息科技有限公司上海-浦东新区1.1万/每月02-18剩余5人
Python高级开发工程师 上海行动教育科技股份有限公司上海-闵行区2.8万/月02-18剩余255人
python开发工程师 上海优似腾软件开发有限公司上海-浦东新区2.5万/每月02-18满员
'''

import re
for one in  re.findall(r'([\d.]+)万/每{0,1}月', content):
    print(one)

运行一下看看,结果是一样的。但是代码却简单多了。

正则表达式,是一种语法,用来描述你想搜索的字符串的特征。

这里指定了一个正则表达式

re.findall(r'([\d.]+)万/每{0,1}月', content)([\d.]+)万/每{0,1}月,就是正则表达式字符串,指定了搜索子串的特征。

为什么这么写?我们后面再介绍。

findall函数返回所有匹配的子串,放在一个列表中。

从上面的例子可以看出,用正则表达式关键的地方在于,如何写出正确的表达式语法。

正则表达式非常强大,语法非常复杂,如果你英文阅读能力还可以,那太好了,点击这里:https://docs.python.org/3/howto/regex.html,参考Python官方文档里面的描述。具体的使用细节包括语法都在里面。

本教程会继续给大家介绍一些常见的正则表达式语法。

想在线Python编程的,快从小蜜蜂网站:http://zglg.work 注册登录体验。

相关推荐
Sonetto19997 分钟前
【Python】【面试凉经】Fastapi为什么Fast
python·面试·flask·fastapi·凉经
夜松云14 分钟前
Qt框架核心组件完全指南:从按钮交互到定时器实现
数据库·qt·交互·信号与槽·ui组件·容器类·定时器机制
计算机学姐20 分钟前
基于SpringBoot的小型民营加油站管理系统
java·vue.js·spring boot·后端·mysql·spring·tomcat
zwjapple20 分钟前
python创建flask项目
开发语言·python·flask
Elastic 中国社区官方博客24 分钟前
JavaScript 中使用 Elasticsearch 的正确方式,第一部分
大数据·开发语言·javascript·数据库·elasticsearch·搜索引擎·全文检索
__ocean34 分钟前
编译Qt5.15.16并启用pdf模块
开发语言·qt·pdf
万物得其道者成35 分钟前
从零开始创建一个 Next.js 项目并实现一个 TodoList 示例
开发语言·javascript·ecmascript
vvilkim40 分钟前
深度解析:Redis 性能优化全方位指南
数据库·redis·性能优化
小光学长1 小时前
基于vue框架的东莞市二手相机交易管理系统5yz0u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
77tian1 小时前
设计模式的原理及深入解析
java·开发语言·单例模式·设计模式·代理模式·享元模式·原型模式