正则表达式能帮我们干什么活:
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这个单词是不会被匹配的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。