练习的时候使用linux+ipython,ipython安装

python的元字符

# 元字符 :
#  .   ^   $   *   +   ?   {}  []   \   |   ()

注:\w还可以匹配下划线和汉字

[ab\d]表示只要匹配该集合中的任一一个表达式都OK

注意并不是按照集合的顺序来匹配的。而是返回第一个符合条件的字符串

注:^$匹配的是行首和行尾, \A\Z匹配的是字符串的首尾【没整没明白】

*? +?  ??

首先明确一点,他们必须结合左右的正则进行匹配,左边必须有内容,右边可以没有,即为''

?? =(匹配字符1?)?匹配字符2, 字符1{0,1}+字符2, 字符1出现次数<=1,字符2出现次数>=1

In [149]: re.match(r'\w??\d','123wer123')  # 第一个\d即数字之前,\w匹配最少可以一次都不匹配,返回第一个数字
Out[149]: <re.Match object; span=(0, 1), match=''> In [150]: re.match(r'\w??\d','w123wer123')  # 第一个\d数字之前,\w最少可以只匹配一次,返回一个字母+第一个数字
Out[150]: <re.Match object; span=(0, 2), match='w1'>   In [151]: re.match(r'\w??\d','wx123wer123')  # 第一个\d数字之前,\w最少会匹配超过一次,最终匹配失败,返回None In [152]: re.match(r'\w??\d','wxwer') #\d没匹配到,所以最终匹配失败,返回None In [153]: re.match(r'\w??','wxwer')  # 在第一个''之前,\w最少可以只匹配0次,最多匹配1次, 非贪婪模式选择最少匹配次数,\w匹配0次,所以返回''
Out[153]: <re.Match object; span=(0, 0), match=''>

*? = 其实可以拆分看 字符1*?字符2,相当于 (字符1*)?字符2, 字符1{0,}+第一个字符2, 字符1次数>=0,字符2出现次数>=1

In [154]: re.match(r'\w*?\d','123wer123') # \w匹配0次,返回第一个数字
Out[154]: <re.Match object; span=(0, 1), match='1'> In [155]: re.match(r'\w*?\d','wx123wer123')  # \w匹配2次, 返回2个字母+一个数字
Out[155]: <re.Match object; span=(0, 3), match='wx1'> In [156]: re.match(r'\w*?\d','wxe')  # \d没有匹配项,最终匹配失败,返回None In [157]: re.match(r'\w*?','wxe')  # 遇到第一个''之前\w可以最多匹配三个,最少可以一次都不匹配,非贪婪模式按\w匹配次数最少的来, \w匹配0次,最终返回''
Out[157]: <re.Match object; span=(0, 0), match=''>

+?=(字符1+)?字符2, 字符1{1,}+第一个字符2, 字符1出现次数>=1,字符2出现次数>=1

In [160]: re.match(r'\w+?\d','%123wer123')  # \w匹配0次,最终匹配失败,返回None

In [161]: re.match(r'\w+?\d','wsx123wer123')  #\w匹配3次,最后返回三个字母+第一个数字
Out[161]: <re.Match object; span=(0, 4), match='wsx1'> In [162]: re.match(r'\w+?\d','wsxwer')  # \d匹配0次,最终匹配失败,返回None In [163]: re.match(r'\w+?','wsxwer')  # 遇到第一个''之前,\w在这里最多可以匹配6次,最好必须匹配一次,非贪婪模式就是按最少的次数来,所以返回第一个字母+'',即第一个字母
Out[163]: <re.Match object; span=(0, 1), match='w'>

In [165]: re.match(r'w+?\w','wsxwer')  # 注意返回的是ws而不是wsxwe,w+表示w可以出现1到多次,ws中w只匹配一次,wsxwe却匹配了2次,非贪婪模式就是捡w匹配次数最少的来,所以返回ws
Out[165]: <re.Match object; span=(0, 2), match='ws'>

看如下示例应该能更好的理解

理解了*?,+?就更好理解了,单独使用同{1},配合后面的表达式使用的时候意味着如果能匹配到后面的表达式则前面无限长匹配,

如果不能匹配到后面一个表达式则只返回匹配到的第一个字符

|单独使用只匹配左右紧邻的表达式,可以和()结合使用

如下示例可以看出分组结合|的妙用, r'1cb|ab' 只能匹配到1cbb和1cab

但是r'1(cb|ab)'则表示匹配1cb和1ab,是把ab和cb当做一个整体

引用编号分组和别名分组,如果分组比较多的时候建议用别名分组

  • \元字符   表示匹配元字符本身

  

  • ^  脱字符,匹配输入字符串的开始的位置

  整个字符串的第一个字符

  

  • $   匹配输入字符串的结束位置

  整个字符串结束字符,但如果最后一个是换行符那按照倒数第二个也可以匹配到,当然直接按照换行符也可以匹配到

  

  • \b  表示单词的边界,\B与\b相反

  

  

  • \d  匹配0~9的数字

  

  • \D 匹配数字以外的字符

  

  • \w 匹配字母或数字或下划线或汉字等

  

  • \W与\w的含义相反,是匹配特殊字符的

  

  • \s   匹配任意的空白符,包括空格,制表符(Tab),换行符等,\S匹配非空白字符

  

python正则元字符的含义的更多相关文章

  1. 第11.16节 Python正则元字符“()”(小括号)与组(group)匹配模式

    一. 什么是组 关于组匹配模式,Python官网上说得比较简单,也没有这个名词,只有组这个名词,老猿查了比较多的资料和做了相关测试之后才理解. 组匹配模式,就是在匹配的正则表达式中使用小括号" ...

  2. $ python正则表达式系列(1)——正则元字符

    本文主要介绍python中正则表达式的基本用法,做一个初步的认识. 1. 初识 python通过re内置模块来处理正则表达式(regex),底层使用C引擎.一个简单的正则匹配的例子: import r ...

  3. Python正则式的基本用法

    Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...

  4. python 正则,常用正则表达式大全

    Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号:  改符号开始 从 ...

  5. Python正则匹配字母大小写不敏感在读xml中的应用

    需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: if s == 'abc':#s为需要匹配的字符串 prin ...

  6. 认识python正则模块re

    python正则模块re python中re中内置匹配.搜索.替换方法见博客---python附录-re.py模块源码(含re官方文档链接) 正则的应用是处理一些字符串,phthon的博文python ...

  7. Python正则简单实例分析

    Python正则简单实例分析 本文实例讲述了Python正则简单用法.分享给大家供大家参考,具体如下: 悄悄打入公司内部UED的一个Python爱好者小众群,前两天一位牛人发了条消息: 小的测试题:  ...

  8. python 正则使用笔记

    python正则使用笔记 def remove_br(content): """去除两边换行符""" content = content.r ...

  9. Python正则处理多行日志一例

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

随机推荐

  1. 二分查找 python实现

    欢迎回来 [^first blood]. 要求A是升序数组 递归 只能查 数据存不存在,不能返回下标 def binary_find(A, m): if len(A) == 0: return -1 ...

  2. SSRF服务器端请求伪造

    SSRF漏洞原理 SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由恶意访问者构造形成由服务端发起请求的一个安全漏洞一般情况下,SSRF访问的目标是从外网无法 ...

  3. C++-HDU3400-Line belt[三分]

    将军饮马问题的升级版 二维平面中要从A到D,给出两条线段AB,CD,分别在线段AB,CD,以及空白处的速度为P,Q,R 求最少用时 由于最优位置满足“凸性”,且两条线段可以等价,所以可以采取三分答案迭 ...

  4. SQLserver 数据类型转换

    1:CAST  方法 CAST(任何有效的表达试  AS 要转换的数据类型 [数据类型的长度,可选]) 例:SELECT  CAST(10000 as varchar(10)) SELECT  CAS ...

  5. [TJOI2015] 线性代数 - 最大权闭合子图

    展开 \(D=(AB-C)A^T\\ =\sum_{i=1}^n(\sum_{j=1}^na_jb_{j,i}-c_i)a_i\\ =\sum_{i=1}^n\sum_{j=1}^na_ia_jb_{ ...

  6. [国家集训队] Crash的数字表格 - 莫比乌斯反演,整除分块

    考虑到\(lcm(i,j)=\frac{ij}{gcd(i,j)}\) \(\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}\) \(\sum_{d=1}^{n} ...

  7. java的服务是每收到一个请求就新开一个线程来处理吗?tomcat呢?

    首先,服务器的实现不止有这两种方式. 先谈谈题主说的这两种服务器模型: 1.收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞 这个是单线程模型,无法并发,一个请求没处理完服务器就会阻塞,不会 ...

  8. JS高级---递归

    递归 递归: 函数中调用函数自己, 此时就是递归, 递归一定要有结束的条件   var i = 0; function f1() { i++; if (i < 5) { f1(); } cons ...

  9. vue学习指南:第十三篇(详细) - Vue的 路由 第三篇 ( 路由的缓存 )

    路由的缓存 路由缓存是 Vue组件优化的一个重要方法 为什么实现路由缓存? 为了 组件间 相互切换不会重复加载数据,影响用户体验,我们通常需要将组件的数组实现缓存,当我们点过来,在点的时候会再次发送 ...

  10. 洛谷P1372 又是毕业季I

    https://www.luogu.org/problem/P1372 #include<bits/stdc++.h> using namespace std; long long n,k ...