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. 正则+re模块知识总结

    目录 正则表达式 定义+特点 元字符 量词 贪婪匹配与非贪婪匹配 转义符 re模块 re.findall re.search re.match re.compile re.finditer re.sp ...

  2. mysql运维入门5:MySQL+kepalived高可用架构

    keepalive 类似3/4/7层交换机制的软件,也就是平时说的第三层.第四层.第七层交换 作用是检测web服务器的状态,如果有一台web服务器.mysql服务器宕机.或工作出现故障,keepali ...

  3. Java并发包4--可重入锁ReentrantLock的实现原理

    前言 ReentrantLock是JUC提供的可重入锁的实现,用法上几乎等同于Synchronized,但是ReentrantLock在功能的丰富性上要比Synchronized要强大. 一.Reen ...

  4. PAT-1132 Cut Integer (整数分割)

    Cutting an integer means to cut a K digits long integer Z into two integers of (K/2) digits long int ...

  5. Mac Chrome浏览器取消自动升级(最新版)

    做自动化突然冒出错误:SessionNotCreatedException: session not created: This version of ChromeDriver only suppor ...

  6. c# 优化代码的一些规则——优先隐式类型[一]

    前言 说到底就是优先使用var,这个关键字,在c# 3.0中出现了. 首先要确认几点,一个就是var 是静态变量,而不是动态变量,也就是说使用var 你是不必去担心性能问题得, 百度百科: 1)静态存 ...

  7. shiro配置springboot的基本配置

    标准配置 对比 https://www.cnblogs.com/xiaozhang666/p/12058341.html  的对应注入查看 package com.zys.sys.config; im ...

  8. 要小心 JavaScript 的事件代理

    我们知道,如果给 form 里面的 button 元素绑定事件,需要考虑它是否会触发 form 的 submit 行为.除此之外,其它场合给 button 元素绑定事件,你几乎不用担心这个事件会有什么 ...

  9. Docker的iptables规则在iptables重启后丢失

    前因后果 1.在跳板机上使用ansible命令测试机器B时,报错如下,于是就怀疑是网络防火墙的问题 10.10.0.86 | FAILED >> { "failed": ...

  10. [ubuntu][mysql 5.7]安装后没有密码?如何登录

    环境:(2020-04-21) WSL ubuntu LTS 18.04.1 mysql Ver 14.14 Distrib 5.7.29, for Linux (x86_64) 找到随机密码 # 显 ...