正则表达式的使用总结(1)

1.1 简介

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

Python 自1.5版本起增加了re 模块,Re模块是Regular expression operations的缩写,即正则表达操作,这个模块会提供正则表达匹配相关操作,其语法格式与Perl相近。

re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串作为它们的第一个参数。

1.2 正则表达式处理流程

在Python中,对正则表达式的支持是通过re模块来进行实现的。简单的来说使用re的一般步骤为:首先将正则表达式的字符串形式转换为模式(Pattern)对象,然后使用Pattern对象处理文本并获得相应的匹配结果(也就是一个Match对象),最后对Match对象使用相应的方法进行其他的操作。

1.3 正则表达式的语法规则

网上介绍正则表达式的内容很多。在这里不一一列举出来。我在这里总结一下自己的想法:

正则表达式是要匹配目标的字符串。正则表达式是由数字和符号集合构成的。元素集合是字符的。正则表达式就是要求规定字符出现+出现的次数 。

限定字符: 能够控制字符出现次数的有: {1,}、?、*、+

能够控制出现的字符的有: 元素集合,如[A-Za-z],、预定义符号,如:\w. \D \W 另外还有逻辑符号的特殊字符 ? | &

定位符:

^代表从字符串开始进行匹配

$代表匹配字符串的末尾

. 代表匹配任意一个字符

理解了这些基本知识以后,可以对以上进行任意的组合.

例如:

.+ 代表 匹配任意1个以上的字符

.{2,}代表匹配任意两个以上的字符

[^0-9] 代表匹配除了数字以外的一个字符

基本的语法规则掌握号以后,后期可以逐步提高。

1.3 Re模块中基本的函数使用

在Python中,对正则表达式的支持是通过re模块来进行实现的。简单的来说使用re的一般步骤为:首先将正则表达式的字符串形式转换为模式(Pattern)对象,然后使用Pattern对象处理文本并获得相应的匹配结果(也就是一个Match对象),最后对Match对象使用相应的方法进行其他的操作。



正则表达式使用的基本流程

Re常见函数:

re.compile(pattern,flags=0)

该函数将字符创pattern编译成正则对象(regular

expression object)

参数pattern是正则表达式; flags是预定义的int常量。


flags有很多可选值:

re.I(IGNORECASE) : 忽略大小写,括号内是完整的写法

re.M(MULTILINE):  多行模式,改变^和$的行为

re.S(DOTALL)   : 点可以匹配任意字符,包括换行符

re.L(LOCALE)  : 做本地化识别的匹配,不推荐使用

re.U(UNICODE)    : 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag,U=0

 re.X(VERBOSE)  冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释

re.A/re.ASCII:   仅执行8位的ASCII码字符匹配

re.DEBUG:  查看正则表达式的匹配过程


函数会返回Pattern对象


Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。

Pattern不能直接实例化,必须使用re.compile()进行构造。

Pattern提供了几个可读属性用于获取表达式的相关信息:

pattern: 编译时用的表达式字符串。

flags: 编译时用的匹配模式,前面已经说过。

groups: 表达式中分组的数量。

groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。




re.search(pattern,string,flags=0)  返回match对象

扫描整个字符string串寻找第一个匹配正则表达式pattern的位置,每找到一个就产生一个match,同时产生match 对象。如果这个对象是None说明匹配不成功。注意 :这与string的search返回不同.string.search()返回的是int,代表匹配的成功的第一个字符的位置position


re.match(pattern,string,flags=0) 同pattern.match()

从String开始就匹配,如果match成功返回match 对象,否则返回none

match与search的区别:

match是从都开始匹配,相当于search里面的pattern添加了^

match只能头开始匹配,无论参数是如何变幻

详见:

https://docs.python.org/3.6/library/re.html#search-vs-match


re.split(pattern,string,maxsplit=0,flags=0)  返回match对象

Match Object

Match.group([group1,...])

用于存储所匹配的字符


参考资料

1.     Welcome to Regular-Expressions.info The Premier website about Regular Expressions

2.    第十二章、正规表示法与文件格式化处理

3.    正则表达式30分钟入门教程

4.    进阶正则表达式

5.    Python Regular Expression Tutorial

6.      6.2. re — Regular expression operations

7.    《精通正则表达式》

8.      《正则表达式必知必会》(2007年,人民邮电出版社)

9. https://docs.python.org/3.6/library/re.html#contents-of-module-re


1.4 问题

Python 的正则表达式字符串为什么要加 r 呢?

提示:python 中的正则表达式文本前面需要添加字母r, 这是为什么呢?如果去掉r 又会如何呢?

不加r也是可以使用的。使用re.compile(r'h\w+')是有一定原因的:

r 是英文单词raw的缩写。

我们都知道字符都是有编码的,我们常见的编码有很多,这些编码之间如果直接转换会出现乱码问题同时也会造成无法匹配。举个例子,假如正则表达式的文本是Unicode编码,而要匹配的文本是GBK,那么匹配过程中可能无法达到预期的效果。也就是说,无法将Unicode字符串与字节模式匹配,反之亦然;同样,当要求替换时,替换字符串必须与模式和搜索字符串的类型相同。所以尽量 raw字符串比配。

其次,正则表达式使用反斜线字符('\')来表示特殊形式或允许使用特殊字符而不用调用其特殊含义。这与Python在字符串文字中用于相同目的的相同字符的使用相冲突;例如,要匹配文字反斜线,可能必须将'\\\\'写为模式字符串,因为正则表达式必须是\\,并且每个反斜杠必须在常规Python字符串文本内表示为\\。

这样写起来会很麻烦的,不是么?

解决方案是将Python的原始字符串表示法用于正则表达式模式;在以'r'为前缀的字符串文字中不以任何特殊方式处理反斜杠。所以r“\ n”是包含'\'和'n'的两个字符的字符串,而“\ n”是包含换行符的单字符字符串。通常,Pattern将使用此原始(raw)字符串表示法以Python代码表示。

总结:

1.     从第一个字符开始匹配,应该使用match 方法

2.    当不需要从第一个字节开始匹配,而是寻找匹配成功的字符串,这种情况可以使用search


1.5 正则表达式的历史

小故事:正则表达式的起源

一位数学家的出现

正则表达式的起源可以追溯到1951年,当时蒂芬科尔克莱恩(Stephen Cole Kleene)开始采用他的数学符号来表述常规语言,后来这些数学符号在被称作正则集合(regular sets)。

但当时仅仅是一种表达手段,并没有流行起来。

一位程序员的出现

正则表达式从1968年开始流行使用,当时的用途主要有两种:在文本编辑器中匹配文本,在编辑器中分析词法。而让正则表达式第一次以编程形式的是肯·汤普森(Ken Thompson ,Kenneth Thompson)。肯•汤普森是一位具有传奇色彩的程序员,在维基百科翻看他的履历,你为他在计算机领域做出的贡献而赞叹不已:他是Unix的设计者和创造者之一;他是Go语言的发明者,早期文本编辑器QED和ed的发明者;他定义了UTF-8编码;他首次实现了正则表达式。当时,汤普森在开发一种编辑器—QED,并将这些符号作为匹配文本文件中的模式的手段。为了提高速度,汤普森在一台装有兼容时间共享系统的IBM 7094机器上实现了正则表达式的功能。后来他将这个功能添加到Unix编辑器中,最终导致了流行的搜索工具grep使用正则表达式。Linux系统中用grep命令来实现正则表达。“grep”是从编辑器中正则表达式搜索命令派生的一个词,g / re / p的含义是“全局搜索正则表达式和打印匹配行(Global search forRegularExpression andPrint matching lines)”。

今天,正则表达式在编程语言,文本处理程序(特别是词法分析器),高级文本编辑器和其他一些程序中得到广泛支持。正则表达式支持是许多编程语言(包括Java和Python)的标准库的一部分,并且构建在其他语言的语法中,包括Perl和ECMAScript。对于实现了正则表达式功能的通常被称为正则表达式引擎,并为可供许多库重用。


Stephen ColeKleene, 正则表达式的发明者
Ken Thompson 一位极客程序员
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容