当前位置: 首页 > news >正文

Python基础 :正则表达式

一、前言

1.1正则表达式简述

正则表达式是一种查找以及字符串替换操作。正则表达式在文本编辑器中广泛使用,比如正则表达式被用于:

  1.检查文本中是否含有指定的特征词

  2.找出文中匹配特征词的位置

  3.从文本中提取信息,比如:字符串的子串

  4.修改文本

与文本编辑器相似,几乎所有的高级编程语言都支持正则表达式。在这样的语境下,“文本”也就是一个字符串,可以执行的操作都是类似的。一些编程语言(比如Perl,JavaScript)会检查正则表达式的语法。

 

1.2 常用的正则匹配工具 

在线匹配工具:

  1. http://www.regexpal.com/ 

      2. http://rubular.com/ 

正则匹配软件:

      McTracer 

      用过几个之后还是觉得这个是最好用的,支持将正则导成对应的语言如java C# js等还帮你转义了,Copy直接用就行了很方便,另外支持把正则表达式用法解释,如哪一段是捕获分组,哪段是贪婪匹配等等,总之用起来 So Happy .

 

1.3正则表达式语法

  \w匹配字母数字及下划线

  \W匹配非字母数字及下划线

  \s匹配任意空白字符,等价于 [\t\n\r\f].

  \S匹配任意非空字符

  \d匹配任意数字,等价于 [0-9]

  \D匹配任意非数字

  \A匹配字符串开始

  \Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串

  \z匹配字符串结束

  \G匹配最后匹配完成的位置

  \n匹配一个换行符

  \t匹配一个制表符

  ^匹配字符串的开头

  $匹配字符串的末尾。

  .匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。

  [...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'

  [^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。

  *匹配0个或多个的表达式。

  +匹配1个或多个的表达式。

  ?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式

  {n}精确匹配n个前面表达式。

  {n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式

  a|b匹配a或b

  ( )匹配括号内的表达式,也表示一个组

可能完了之后就有点晕晕的了把,不用担心,下面我们会详细讲解下一些常见的规则的用法。怎么用它来从网页中提取我们想要的信息。

 

1.4Python中使用

其实正则表达式不是Python独有的,它在其他编程语言中也可以使用,但是Python的re库提供了整个正则表达式的实现,利用re库我们就可以在Python中使用正则表达式来,在Python中写正则表达式几乎都是用的这个库。

下面我们就来了解下它的用法。

match()

在这里首先介绍第一个常用的匹配方法,match()方法,我们向这个方法传入要匹配的字符串以及正则表达式,就可以来检测这个正则表达式是否匹配字符串了。

match()方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果,如果不匹配,那就返回None。

我们用一个实例来感受一下:

import re

content ='Hello 123 4567 World_This a Regex Demo'
print (len(content))
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}',content)
print result
print result.group()
print result.span()

输出结果:

在这里我们首先声明了一个字符串,包含英文字母、空白字符、数字等等内容,接下来我们写了一个正则表达式^Hello\s\d\d\d\s\d{4}\s\w{10}来匹配这个长字符串。

开头的^是匹配字符串的开头,也就是以Hello开头,然后\s匹配空白字符,用来匹配目标字符串的空格,\d匹配数字,三个\d匹配123,然后再写一个\s匹配空格,后面还有4567,我们其实可以依然用四个\d来匹配,但是这么写起来比较繁琐,所以在后面可以跟{4}代表匹配前面的字符四次,也就是匹配四个数字,这样也可以完成匹配,然后后面再紧接一个空白字符,然后\w{10}匹配10个字母及下划线,正则表达式到此为止就结束了,我们注意到其实并没有把目标字符串匹配完,不过这样依然可以进行匹配,只不过匹配结果短一点而已。

我们调用match()方法,第一个参数传入了正则表达式,第二个参数传入了要匹配的字符串。

打印输出一下结果,可以看到结果是SRE_Match对象,证明成功匹配,它有两个方法,group()方法可以输出匹配到的内容,结果是Hello 123 4567 World_This,这恰好是我们正则表达式规则所匹配的内容,span()方法可以输出匹配的范围,结果是(0, 25),这个就是匹配到的结果字符串在原字符串中的位置范围。

通过上面的例子我们可以基本了解怎样在Python中怎样使用正则表达式来匹配一段文字。

二、正则表达式练习

          初级练习

                   1、求非负整数 : ^\d+$

                       Tips:需要注意的是这个匹配模式为多行模式下进行的

             

                  2、匹配正整数: ^[1-9]*[1-9][0-9]*$ 在网上也有这种写法的 ^[0-9]*[1-9][0-9]*$

                      这里截图我也不贴了,前者指能匹配123012这种整数,而后者可以匹配001230。

                       取舍就看实际的需要了

                  3、非正整数:^(-\d+|(0+))$

                  4、负整数:^-[0-9]*[1-9][0-9]*$  

                  5、整数 :^-?\d+$

                  6、非负浮点数 :^\d+(\.\d+)?$

                  7、正浮点数 :^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

                  8、非正浮点数 :^((-\d+(\.\d+)?)|(0+(\.0+)?))$

                  9、负浮点数:^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

                 10、浮点数:^(-?\d+)(\.\d+)?$

                 11、有数字、26个英文字母组成的字符串:^[A-Za-z0-9]+$

          中级练习

 

                   1、长度为8-10的用户密码(以字母开头、数字、下划线)

                        ^[a-zA-Z]\w{7,10}$

                   2、验证输入只能是汉字 : ^[\u4e00-\u9fa5]{0,}$

                   3、电子邮箱验证:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

                   4、URL地址验证:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

                   5、电话号码的验证:请参考:http://blog.csdn.net/kiritor/article/details/8733469

                   6、简单的身份证号验证:\d{15}|\d{18}$

                   ..............................          

          高级练习

                  1、提取并捕获html标签内容:

                     <a(?: [^>]*)+href=([^ >]*)(?: [^>]*)*>

               

                    <OPTION\s.*?>

               

以上练习是参考网上的。写的不好之处,请大家多多指教。

转载于:https://www.cnblogs.com/rain007/p/7131107.html

相关文章:

  • 是否有网络
  • 是时候学一波STL了。。。
  • html特殊字符的html,js,css写法汇总
  • 19_传智播客iOS视频教程_类和对象
  • Msql入门实战之下
  • Repeater的使用及其鼠标特效,行链接的使用
  • Linux下汇编语言学习笔记15 ---
  • 安卓生成证书 for mac
  • Hive任务优化(2)
  • Maven classpath
  • java编译变量的正确写法和控制台输入
  • 搜索引擎高级搜索语法
  • SQL索引基础
  • Node.js 之 HTTP实现详细分析
  • 断言
  • [deviceone开发]-do_Webview的基本示例
  • 【Amaple教程】5. 插件
  • 【刷算法】从上往下打印二叉树
  • conda常用的命令
  • css选择器
  • Fastjson的基本使用方法大全
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Javascript 原型链
  • Java反射-动态类加载和重新加载
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Service Worker
  • vue-router的history模式发布配置
  • 程序员最讨厌的9句话,你可有补充?
  • 基于HAProxy的高性能缓存服务器nuster
  • 前端_面试
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 实现简单的正则表达式引擎
  • 使用Gradle第一次构建Java程序
  • 算法系列——算法入门之递归分而治之思想的实现
  • 网络应用优化——时延与带宽
  • scrapy中间件源码分析及常用中间件大全
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #define,static,const,三种常量的区别
  • #include到底该写在哪
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (SpringBoot)第二章:Spring创建和使用
  • (二)fiber的基本认识
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转载)Linux 多线程条件变量同步
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .equals()到底是什么意思?
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 依赖注入的基本用发
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET正则基础之——正则委托
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?