1.1 简介/动机
操作文本或者数据可是件大事。
正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础,它们能够匹配多个字符串。
python通过标准库中的re模块来支持正则表达式。
建议这章作为入门时的字典使用,不用行去背去记住,除非是经常要用到,并且这章不太适合做读书笔记等,因为本身就不好去描述一些规则,必须使用例子去学习,也就是多看多练多用。
前面1.1是简介,1.2是关于正则表达式的规则说明,适合没有正儿八经学过正则表达式的同学看,1.3开始介绍python与正则表达式。
核心提示:
作者会通篇使用两个名词:搜索和匹配。搜索意指该字符串中任意部分搜索字符串,匹配是指从字符串开头开始,部分或全部的匹配。
作者举的例子我没能看懂,作者解释了一个正则表达式,是以字母开头的,结果匹配的却是一个数字开头的,我没有学过正则表达式,导致我很疑惑,感觉在这里讲这个正则的例子不是很合适。
你的第一个正则表达式:
这里简单讲了下正则表达式的组成和含义:包含文本和特殊字符的字符串,描述一个可以识别各种字符串的模式。作者在这里举了几个简单的例子阐述了正则表达式看起来很难,实则是比教简单的。
1.2特殊符号和字符
常见的正则表达式符号和特殊字符表
表 示 法 描 述 正则表达式示例
符号
literal 匹配文本字符串的字面值 literal foo
re1|re2 匹配正则表达式 re1 或者 re2 foo|bar
. 匹配任何字符(除了\n 之外) b.b
^ 匹配字符串起始部分 ^Dear
$ 匹配字符串终止部分 /bin/*sh$
* 匹配 0 次或者多次前面出现的正则表达式 [A-Za-z0-9]*
+ 匹配 1 次或者多次前面出现的正则表达式 [a-z]+\.com
? 匹配 0 次或者 1 次前面出现的正则表达式 goo?
{N} 匹配 N 次前面出现的正则表达式 [0-9]{3}
{M,N} 匹配 M~N 次前面出现的正则表达式 [0-9]{5,9}
[…] 匹配来自字符集的任意单一字符 [aeiou]
[..x-y..] 匹配 x~y 范围中的任意单一字符 [0-9], [A-Za-z]
[^…] 不匹配此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现) [^aeiou], [^A-Za-z0-9]
(*|+|?|{})? 用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、 +、 ?、 {}) .*?[a-z]
(…) 匹配封闭的正则表达式,然后另存为子组 ([0-9]{3})?,f(oo|u)bar
\d 匹配任何十进制数字,与[0-9]一致( \D 与\d 相反,不匹配任何非数值型的数字) data\d+.txt
\w 匹配任何字母数字字符,与[A-Za-z0-9_]相同( \W 与之相反) [A-Za-z_]\w+
\s 匹配任何空格字符,与[\n\t\r\v\f]相同( \S 与之相反) of\sthe
\b 匹配任何单词边界( \B 与之相反) \bThe\b
\N 匹配已保存的子组 N(参见上面的(…)) price: \16
\c 逐字匹配任何特殊字符 c(即,仅按照字面意义匹配,不匹配特殊含义) \., \\, \*
\A(\Z) 匹配字符串的起始(结束)( 另见上面介绍的^和$) \ADear
扩展表示法
表 示 法 描 述 正则表达式示例
(?iLmsux) 在正则表达式中嵌入一个或者多个特殊“ 标记” 参数(或者通过函数/方法) ( ?x),(? im)
(?:…) 表示一个匹配不用保存的分组 (?:\w+\.)*
(?P<name>…) 像一个仅由 name 标识而不是数字 ID 标识的正则分组匹配 (?P<data>)
(?P=name) 在同一字符串中匹配由(?P<name)分组的之前文本 (?P=data)
(?#…) 表示注释,所有内容都被忽略 (?#comment)
(?=…) 匹配条件是如果…出现在之后的位置,而不使用输入字符串;称作正向前视断言 (?=.com)
(?!…) 匹配条件是如果…不出现在之后的位置,而不使用输入字符串;称作负向前视断言 (?!.net)
(?<=…) 匹配条件是如果…出现在之前的位置,而不使用输入字符串;称作正向后视断言 (?<=800-)
(?<!…) 匹配条件是如果…不出现在之前的位置,而不使用输入字符串;称作负向后视断言 (?<!192\.168\.)
(?(id/name)Y|N ) 如果分组所提供的 id 或者 name(名称)存在,就返回正则表达式的条件匹配 Y,如
果不存在,就返回 N; |N 是可选项 (?(1)y|x)
————————————————
版权声明:本文为CSDN博主「田园诗人之园」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014100559/article/details/87087046
1.2.1使用择一匹配符号匹配多个正则表达式
择一匹配的管道符号(|):表示从多个模式中选择其中一个的操作,用来分隔不同的正则表达式。择一匹配被称作并或者逻辑或。
1.2.2匹配任意单个字符
使用点号匹配任意单个字符。使用反斜线转义可以匹配点号。
1.2.3从字符串起始或者结尾或者单词边界匹配
用于指定要匹配字符串的位置的特殊字符
指定字符串的起始位置:脱字符(^)特殊字符(\A)
指定字符串的末尾位置:美元符号($)或者(\Z)
指定字符串的边界位置:\b匹配起始位置,用\bthe\b就可以只匹配the,\B匹配不起始位置
1.2.4创建字符集
[]方括号:用于匹配某些特定字符中的一个。逻辑或的功能。
1.2.5限定范围和否定
-和^的应用,-是可以指定字符的范围,^表示不匹配
1.2.6使用闭包操作符实现存在性和频数匹配
介绍特殊符号:* + ?{}
1.2.7表示字符集的特殊字符
介绍特殊字符:d \s \w
1.2.8使用圆括号指定分组
介绍圆括号的作用:1.对正则表达式进行分组,2.匹配子组。重点内容,要记下。
1.2.9扩展表示法
介绍(?...)
以上为正则表达式的语法介绍,感觉正则表达式很难用语言去形容具体的规则,具体还是要看具体例子才容易懂。
以下为这章的重点。
1.3正则表达式和python语言
介绍正则表达式和python的历史相关,不重要,只是想引出下面想讲的re模块。
1.3.1re模块:核心函数和方法
放了一张re函数表,眼熟下就行。
核心提示:编译正则表达式(编译还是不编译)
编译成对象之后执行的更快。作者强烈建议正则表达式预编译。
1.3.2使用compile()函数编译正则表达式
首先是预编译不是强制性的,其次是预编译和没有预编译的方法是一样的。
1.3.3匹配对象以及group()和groups()方法
group()返回的是整个匹配对象或者按照要求返回特定子组;groups()返回的是一个唯一或者全部子组的元组。
1.3.4使用match()方法匹配字符串
match():试图从字符串的起始部分对模式进行匹配;成功返回匹配对象,失败返回none;使用group()可以输出当前对象;
要注意的是none没有match()方法,所以如果直接对输出的结果不用if直接用.group(),会抛出异常。
1.3.5使用search()在一个字符串中查找模式(搜索与匹配的对比)
match从字符串的起始部分就开始匹配,但是很多种情况是在字符串的中间部分才能匹配上,就用到了search方法。
search方法与match唯一的区别就是匹配的位置不同(match开头,search任意位置),工作方式完全一致,可以看成孪生兄弟方法。
以下直接为正则表达式如何运用在python程序中,建议大家多多练习书中的例子,读完这个我发现我表达能力真的有限(:俺也一样)
1.3.6匹配多个字符串
正则表达式中符号(|)如何用在python语句中
写好正则表达式直接用上面讲的match和search方法即可。
1.3.7匹配任何单个字符
正则表达式中符号(.)如何用在python语句中
同上
1.3.8创建字符集([])
正则表达式中符号([])如何用在python语句中
同上
1.3.9重复、特殊字符以及分组
目前工作暂时用不到过多的正则表达式,暂时不再阅读。(与其说是正则表达式用的少,倒不如说是对字符串处理用的比较多)