python 中re库(正则表达式)的一些困惑解疑

来源:互联网 发布:剑三儒风盾太数据 编辑:程序博客网 时间:2024/06/06 19:09

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。



疑惑1:

首先要明确re库中的普通字符,特殊字符(元字符)以及打印字符。

1普通字符

一般为所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。

打印字符:主要包括一些换行符,换页符,空白符等 /f /n /r 。


2特殊字符元字符

所谓特殊字符,就是一些有特殊含义的字符,就是我们正则真正用来匹配的字符,即把原来的普通字符放在了re表达式中有了

特殊的含义,从而能够匹配到我们想要的内容。

简单介绍几个常用的匹配字符:

$:配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。

*:匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。

.:匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。

+:匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。

?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。

():标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。


疑惑2:

我们经常看到的. * ? + 是什么 为什么这三个字符一起连用很常见。

.:表示除换行符任意一个单字符。

而 * ? +都是用来匹配前面表达式blablabla次,连用起来就是相当于匹配一个字符0次1次或者n次。

疑惑3:

\ 这个字符到底用处是什么,为什么很多正则表达式出现 \ 。

我们先来看它的含义:将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。

’\n’ 匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘\(’ 则匹配 “(”。

简单来说就是我们利用特殊字符进行了正则匹配,但是如果我不想把它看成正则式中的特殊字符,我就想利用它原来的含义,那么该怎么

办?这里就用到 \ 这个特殊的字符了,就是为了不让一些字符成为特殊字符,保留其原来的意思。

这里举个例子,我们看一下下面的程序(简化程序):

import re

tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)

这里出现了很多 \ 还有引号 冒号 . ? * 看着挺复杂。其实看过前面的介绍就不难分析。

为了避免引号 冒号 成为特殊字符,所以用到 \ ,因此 \ " 即代表引号的意思 只是把引号成为特殊字符的机会

给屏蔽了。看过僵尸吗 ? 引号就是个僵尸,在特殊环境(正则表达式findall)中,即将恶化变成特殊字符,但是因为一

到符咒(\)贴在了前面,不管怎么得环境,你该是啥还是啥,不会变成特殊环境下的产物了。当然要注意下r ''是防止\ 进

行转义(读取文件路径时)或者避免引号范围乱用。r意思是raw string 代表纯粹的字符串,使它不会对引号里面的反斜杠\

进行特殊的处理。这个题就相当于"raw_title\":"正则表达式匹配内容"。





原创粉丝点击