homepage

1. 相关概念

1.1. rstring

rstring: 非转义的原始字符串

普通字符中可能包含转义字符,用于表示对应的特殊含义的,比如最常见的'\n'表示换行,'\t'表示Tab等。而如果是以r开头,那么说明后面的字符,都是普通的字符了,即如果是'\n'那么表示一个反斜杠字符,一个字母n,而不是表示换行了。

rstring常用于正则表达式,对应着re模块。

1.2. 元字符

2. 模式Pattern

模式字符串使用特殊的语法来表示一个正则表达式:

  • 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
  • 多数字母和数字前加一个反斜杠时会拥有不同的含义。
  • 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
  • 反斜杠本身需要使用反斜杠转义。
  • 由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 '\t')匹配相应的特殊字符。

实例

实例 描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符

2.1. re.flag

修饰符 描述
re.I 使匹配对大小写不敏感(re.IGNORECASE)
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $(re.MULTILINE)
re.S 使 . 匹配包括换行在内的所有字符(re.DOTALL)
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

3. API

re.compile(re_pattern) -> Pattern

re.match(re_pattern: str, origin_string, flags=0)  # return None if Failed...
re.search(pattern, string, flags=0) # 匹配任何位置 re.MatchObject.group() # 返回匹配对象的字符串
匹配对象的其他方法还有 start()、end()、span(). 具体见下文 re.sub(pattern, repl, string, count=0) # repl: 替换字符串,也可以为一个函数
re.compile(pattern[, flags]) # 生成一个表达式对象(re.RegexObject),一般供给 match()、search()、findall()
findall(string, pos=0, endpos=0) # 返回所有符合正则的字符串列表
finditer(pattern, string, flags=0) # 类似findall, 返回多个符合条件的正则对象(pattern)迭代器
re.split(pattern, string, maxsplit, flags) # 按正则的格式分割字符串

使用示例

pattern = re.compile(r'\d+')
m = pattern.match('abcd 1234')
t = pattern.findall('abc 123')

在上面,当匹配成功时返回一个 Match 对象,其中:

  • group([group1, …]): 用于获得一个或多个分组匹配的字符串

    • group() 或 group(0): 返回re整体匹配的字符串
    • group(n,m): 返回组号为(n,m)所匹配的字符串
    • groups(): 以tuple形式返回所有匹配的group
  • start([group=0]): 用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引)
  • end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1)
  • span([group]): 返回 (start(group), end(group))

4. 其他

4.1. 单词边界 '\b'

字符的位置是非常重要的。如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。如果它位于字符串的结尾,它在单词的结尾处查找匹配项。

import re

str1='i love python '
str2=re.findall(r'\bon',str1)
str3=re.findall(r'on\b',str1)
print(str2)
print(str3) 输出:
[]
['on']

4.2. 贪婪和非贪婪

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符。在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。

贪婪模式下字符串查找会直接走到字符串结尾去匹配,如果不相等就向前寻找,这一过程称为回溯。

4.3. 切片、替换

re.subn(pattern, repl, string[, count]) --> (sub(repl, string[, count]), 替换次数)

使用repl替换string中每一个匹配的子串后返回替换后的字符串。

  • 当repl是一个字符串时,可以使用\id或\g、\g引用分组,但不能使用编号0。
  • 当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
  • count用于指定最多替换次数,不指定时全部替换。
pattern = re.compile(r'(\w+)(\w+)(\d+)')

#先切片测试
print re.split(pattern,str)
print re.sub(pattern,r'\3 \1',str) #subn统计sub替换次数
print re.subn(pattern,r'\3 \1',str)

Python正则式 - re的更多相关文章

  1. Python正则式的基本用法

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

  2. python正则式

    (|):匹配多个正则表达式模式.at|home 匹配at和home (.):匹配任意一个单个字符.f.o匹配f和o中间任意的字符,如foo,f#o (^ / $ / \b / \B):^从字符串开头开 ...

  3. Python使用re模块正则式的预编译及pickle方案

    项目上线要求当中有言论和昵称的过滤需求, 客户端使用的是python脚本, python脚本中直接利用re模块来进行正则匹配, 一开始的做法是开启游戏后, 每帧编译2条正则式, 无奈运营需求里面100 ...

  4. JavaScript正则式练习

    使用正则式匹配第一个数字和最后一个数字,使用环视 str2 = 09051 : Fast Food Restaurants - Concession Stands/Snack Bars Delicat ...

  5. python正则的中文处理(转)

    匹配中文时,正则表达式规则和目标字串的编码格式必须相同 print sys.getdefaultencoding() text =u"#who#helloworld#a中文x#" ...

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

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

  7. python 正则使用笔记

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

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

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

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

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

随机推荐

  1. Java集合--阻塞队列及各种实现的解析

    阻塞队列(Blocking Queue) 一.队列的定义 说的阻塞队列,就先了解下什么是队列,队列也是一种特殊的线性表结构,在线性表的基础上加了一条限制:那就是一端入队列,一端出队列,且需要遵循FIF ...

  2. 201771010128王玉兰《面向对象与程序设计(Java)》第十七周学习总结

    第一部分:理论基础 线程的同步 多线程并发运行不确定性问题解决方案:引入线 程同步机制,使得另一线程要使用该方法,就只 能等待. 在Java中解决多线程同步问题的方法有两种: - Java SE 5. ...

  3. 设置键盘return键样式

    textField.returnKeyType = UIReturnKeySend; typedef NS_ENUM(NSInteger, UIReturnKeyType) { UIReturnKey ...

  4. Opencv+Python实现缺陷检测

    实验七.缺陷检测 一. 题目描述 ​ 对下面的图片进行缺陷检测操作,请详细地记录每一步操作的步骤. ​ 第一站图片是标准样品,后面几张图中有几个样品有瑕疵,需要你通过计算在图片上显示出哪张是合格,哪张 ...

  5. SVN创建分支的相关操作

    目的是为了在项目中进行相应的功能操作的时候避免项目的报错还能进行还原 1.在相应的位置创建分支 项目过大的只在 功能的位置 进行创建分支 Angular的src 不要在其下面进行创建分支 他有严格的文 ...

  6. 阿里云ECS封25端口导致wordpress无法发送邮件的解决

    在有人评论你的文章,wordpress默认会尝试向博主发送邮件,而如果你用的是阿里云ECS,你会发现评论已经成功了,但是由于邮件发送失败会导致用户评论后页面就卡住了,原因就在于阿里云的ECS目前已经全 ...

  7. wordpress各种获取路径和URl地址的函数总结

    wordpress中的路径也不是很负责,有人为了让wordpress运行速度更快,就直接写了绝对地址,其实这样是很不好的,有可能别人修改了wordpress程序的地址,那么这样你编写的这个插件或者是主 ...

  8. Meta标签基本使用

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><t ...

  9. Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序

    1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...

  10. SpringCloud(四)- Hystris简介及@EnableCircuitBreaker 和 @HystrixCommand 注解的使用

    唯能极于情,故能极于剑有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正,期待和大家一起学习交流 此文由四部分组成(Hystris简介.@EnableCircuit ...