图片描述

正则表达式能帮我们干什么活:

  • 1:检测输入的字符串中,某一字符串是否满足特定格式,如字符中是否为合法的email邮箱格式

  • 2:检测某一特定单词,是否在文本中出现过(只需要通常一次的scan)

  • 3: 提取出文件中的特定格式字符串

  • 4:使用新的字符串,代替特定格式的字符串

  • 5:把大片的字符串,分成很多小的字符串,例如python中的split函数可以以逗号为分隔符,把大片字符串,分隔成多个子字符串

第一章:学习正则表达式 是如何工作的

History

  • Ken Thompson:unix的设计编写者,首个在机器上使用regular expression 的人

  • 第一个正则表示式: g/<regular expression>/p

  g:代表global (全局范围查找)
  p:代表print  (打印出来匹配的结果)
  • 上面的正则表达式为了简化,写成grep (我们在linux上常用的查找命令)

  • 后来Henry Spence写了一个正则表达式的库:regex,这样就可以在c/c++程序中使用
    正则表达式了。

  • 接下来Larry Wall发明了支持正则表达式的Perl脚本语言,使正则表达式开始流行起来

  • Perl语言对正则表达式进行了扩展,加入了自己的风格,称为Perl flavor

  • 后来实现的regular expression都是Perl flavor的变种

  • python中使用的是基于Perl flavor的正则

  • how to leverage the standard re module in python

  • 书中学习,如何利用python中标准的re 模块

正则表达式中的语法学习

语法是任何编程语言的必修课,语法说通俗点,就是规则,我们要在规定的规则内
做事情!

正则表达式中,会出现的各种规定性的内容:
* :一个或多个字符
? :一个字符 


file*.xml
file?.xml 
上面两个正则表达式中:都包含两个部分:
file  .xml部分:我们称为 literals (文字常量部分)
? * 部分: 我们称为 metacharacters (元字符部分)
  • 对正则表达式定义的描述:字符串 表达式中,既包含 普通的字符串,也包含特殊的字符串,这个正则字符串,可以匹配出所有 满足metacharacters条件的 这一类字符串

例子学习:
g/a\w*/p    #同样g:global 全局查找,p:print出来

以a开头字符串,  \w* 这个就是metacharacters,   \w是对*的补充吗?只能是字母吗


g/xxx/p
g/a\w*/p   这个是非常简单的re,但包含了重要的概念

sed -n "/Music/p" a.txt  # 显示a.txt文件中包含Music这个单词的行

书中空格使用->表示 

\w是 匹配数字,字母,下划线字符 (metacharacters)

* 代表 前面描述特征字符的一个或多个重复

重要: 空格也是一般的iteral字符 (所以空格在re中,不需要转义表示)

对于正则表达式中,语法上面的问题实际上不多:分为三个部分

  • g/re/p

  • 第1部分:以g为代表

  • 第2部分:以re部分:re这一部分又分为两部分:literal and metacharacters

  • 第3部分:以p为代表

所以把上面的3个部分弄明白,正则就没有多神秘了!!!!
下面我们来各个击破!!!

下面我们首先从re部分的literal部分说起:

literal是正则中最简单的部分,只是简单的在字符串中寻找,是否有literal部分
以例子来说:
使用/fox/ 对"the quick brown fox jump over the lazy dog"字符串进行match时,
我们就可以找到一个match (因为在这句话中只有一个fox单词)

使用/be/ 对"To be or not to be ,that is a question",字符串进行match时,
我们就可以得到两个match的结果。

如果括号是metacharacters,但是我们想要对括号进行match,怎么办呢?

  • 1:很容易对原来是metacharacters的字符进行转义就可以了!

  • 2:在python中,使用re.escape 方法

  • 3:把metacharacters,放到 Q E之间,如Q?E,这样问号就是匹配问号,不会有metacharacters的含义了。

上面的三种方法,都是做同样的事情,使metacharacters的符号 进行去metacharacters化。这样符号就能表示自己原本的意思了!

注意:第3种方法去metacharacters的方法,在pyhton中不适用

使用/\(this is inside\)/ 对"this is outside(this is inside)"字符串进行匹配时,match的结果才会是(this is inside)这个结果。
上面使用方法1对 括号进行去metacharacters化

escape:转义

在正则表达式中,有12个metacharacters 字符需要转义:(最好背着)

\   backslash
|   pipe symbol
+   plus
.   dot

^   caret
$   dollar


?   question mark
*   asterisk

() parenthesis
[] square parenthesis
{} curly parenthesis

上面的这些符号就是所谓的具有特殊意义的metacharacters

  • 分个类:3对括号,? * , 美元,倒v, 点加树(.+ |)

(实用部分)对单个字符位置匹配一定范围字符的方法

1:Metacharacters 的一个表达 通常都是匹配一类情况

例如:我们如果想要找到一个 文本中 英式和美式英语中的licence 和license 单词

这里我们通过正则表达式就非常容易找出来了,两个单词就是到数第2个字母不一样
使用方括号,把上面所有情况包含起来即可,如下

g/licen[cs]e/p     

#这样就可以把文本中这两个单词都打印出来了

2:上面是最简单的情况,如果我们在单词的某一个字符位置,想匹配一定范围的字母,如下使用“-”这个符号即可搞定

举例: 想找出文本中 bag bbg bcg bdg  左边这四个单词

g/b[a-d]g/p  这样就搞定了,(所以匹配一定范围的字母或数字,使用 减号即可)

[a-z]  在某一个位置匹配全部字母
[0-9]  在某一个位置匹配全部数字 

3:如果在某一个位置既要匹配所有的字母,又要匹配所有的数字,怎么办呢?

有了上面的基础,应该知道怎么写了 :

[a-z0-9A-Z]    

注意:上面的例子只是对一个字符位置进行匹配

4:还有一种情况,也是非常有用的,比如在某一个字符位置,我们希望匹配除了0到9以外的所有其它情况

例如,我们需要匹配helloX   .其中X为非0到9的所有字符 (这个所有字符应该也是有定义的)

g/hello[^0-9]/p       

使用^符号,相当于取反的作用,
注意:上面的例子中hello后面必须有一个非数字的字符,单个hello这个单词是不会被匹配的

猫哥
305 声望44 粉丝

热衷于研究各类互联网技术,热爱学习,热爱生活!