Python正则式 - re
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的更多相关文章
- Python正则式的基本用法
Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...
- python正则式
(|):匹配多个正则表达式模式.at|home 匹配at和home (.):匹配任意一个单个字符.f.o匹配f和o中间任意的字符,如foo,f#o (^ / $ / \b / \B):^从字符串开头开 ...
- Python使用re模块正则式的预编译及pickle方案
项目上线要求当中有言论和昵称的过滤需求, 客户端使用的是python脚本, python脚本中直接利用re模块来进行正则匹配, 一开始的做法是开启游戏后, 每帧编译2条正则式, 无奈运营需求里面100 ...
- JavaScript正则式练习
使用正则式匹配第一个数字和最后一个数字,使用环视 str2 = 09051 : Fast Food Restaurants - Concession Stands/Snack Bars Delicat ...
- python正则的中文处理(转)
匹配中文时,正则表达式规则和目标字串的编码格式必须相同 print sys.getdefaultencoding() text =u"#who#helloworld#a中文x#" ...
- python 正则,常用正则表达式大全
Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号: 改符号开始 从 ...
- python 正则使用笔记
python正则使用笔记 def remove_br(content): """去除两边换行符""" content = content.r ...
- Python正则处理多行日志一例
正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...
- Python正则匹配字母大小写不敏感在读xml中的应用
需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: if s == 'abc':#s为需要匹配的字符串 prin ...
随机推荐
- CF948D Perfect Security
题目链接:http://codeforces.com/contest/948/problem/D 知识点: Trie 题目大意: 给出两个长度为 \(N(1 \le N \le 300000)\) 的 ...
- JavaScript的基础语法及DOM元素和事件
一,JavaScript是什么? 1,JavaScript简称:js,是一种浏览器解释型语言,嵌套在HTML文件中交给浏览器解释执行.主要用来实现网页的动态效果,用户交互及前后端的数据传输等. 2,J ...
- NPM的由来——为什么要使用NPM
原文:https://blog.csdn.net/qq_37696120/article/details/80507178 https://blog.csdn.net/hong10086/articl ...
- 简单poi操作word@2020
个人采用POI(3.16版本)一.段落部分XWPFParagraph paragraph = docxDocument.createParagraph();1.段落对齐方式paragraph.setA ...
- JavaScript之倔强的字符串
关于倔强的JavaScript字符串:不可以被修改 我们是字符串 我们的口号是:你可以消灭我,但是你不能改变我 JavaScript字符串是不可改变的,当真是这样的吗? 让我们来试验一下. var n ...
- [书籍分享]0-008.商业模式新生代[Business Model Generation]
封面 内容简介 <商业模式新生代>内容简介:当你愉快的看完第一章:商业模式画布,赫然发现这些构成要素全都交织成一幅清晰的图像在脑海中呈现,它们如何互相影响.如何交互作用全都历历在目.利用商 ...
- [注]6W运营法则教你盘活社区内容运营
社区运营人员大体分为两种:一种是内容运营,这类人才基于产品,一般对文字以及对广告文案比较敏感:另外一种则是更多基于产品推广运营,前者需要把内容最大化地曝光,后者则是把产品推送给用户,两者的是相辅相成, ...
- (九)显示交易记录 &解决相对路径问题
UserServlet.java package com.aff.bookstore.servlet; import java.io.IOException; import javax.servlet ...
- java类的方法的使用
类的方法:提供某种功能的实现: 实例:public void eat (){ } public String getName(){ } public void setName(String n){ ...
- 关于安装Linux-centOS时遇到的问题
1.新建虚拟机实例后倒入centos镜像开机报错.提示不支持 64 位.... 重新下载虚拟机安装包,重新安装. 2.安装到检查光盘镜像的下一步,vm is nor support (or ... c ...