2018-09-05 scrapy 分支re正则表达式

正则表达式再学习(这里说的是re模块)

因为在python中,想 \ 代表转义字符的前缀所以 \\ 在python中== \,这时候我们就有我们

原始字符串登场了,原始字符串中\不在被视为一个特殊的字符,所以在正则表达式中强烈推荐使用

原始字符串和一般的字符串唯一的区别在于,他的所有\都是经过转义的 就是 \ == \\

特殊字符

\d  表示任何十进制数字  0-9              类[0-9]

\D  与\d相反,匹配任何非十进制数字的字符 相当于类[^0-9]

\s  匹配任何空白字符(空格,换行符,制表符tab) 类[\t\n\t\f\v]

\S  匹配任何非空白字符      类[^\t\n\r\f\v]

\w  匹配任何单词字符

\W 匹配任何费单词字符

\b  匹配单词的开始或结束

\B  与\B相反

.    元字符,他匹配出了换行符之外的所有字符

*    元字符,他用于指定前一个字符匹配零次或者任意次 == {0,}

+  元字符,它用于指定前一个字符匹配一次或者任意次 =={1,}

?  元字符,它用于指定前一个字符匹配一次或者零次 == {0,1}

{}  元字符,  上面几个元字符都可以使用他来表达,他的含义是,前一个字符必须匹配{m,n} m次到n次

^  元字符匹配字符串起始的位置比如,re.search(‘^From’,’From Here to Eternity’) (那么问题就来了,为什么我不直接用match呢)

    设置了MULLINE标签,他会匹配每一行的开始

$  元字符,匹配字符创结束的位置print(re.search(‘}$’, ‘{block}’)) ,如果最后不是以}结尾的将返回None

\A  在没有设置标签的时候 == ^,设置标签后还是匹配首字母

\Z  只匹配字符串结束的位置==$

|    就是很普通的或你懂得

\b  零宽断言,就是在\b的位置,你必须是空白字符,才能算你匹配成功(基本是这样)

如何运用re模块,首先我们生成一个compile对象

\B  就是\b的另一面,必须是非空白字符

import re

p = re.compile(‘[a-z]+’)

现在p就代表一个规则。他自带了四个方法去匹配字符串

match()  从首字母开始匹配,如果string包含了规则中的字符串就代表匹配成功,匹配成功会返回一个

对象    <_sre.SRE_Match object; span=(0, 3), match=’add’>,注意,是从首字母开始匹配!!不成功就返回None

而且注意,这个span的3是最后一个匹配到字符的后一位

search()就在整个字符串里找找到就返回一个<_sre.SRE_Match object; span=(0, 3), match=’add’>对象,找不到

返回None,如果有多个能够被匹配到的字符串,那么只返回第一个

findall() 在字符串中寻找所有的符合条件的字符串,找到了就返回一个列表,注意,这里面的都是字符串形式的[‘qwe’,’weq’]酱婶儿的

findliter()  在字符串中寻找所有符合条件的字符串,找到了就返回一个迭代器,里面全是<_sre.SRE_Match object; span=(0, 3), match=’add’>对象

说一下<_sre.SRE_Match object; span=(0, 3), match=’add’>这种类型的对象叫做匹配对象‘

说明一下匹配对象自带的查看自身信息的函数

obj.group()返回匹配的字符串

obj.strat()返回匹配开始的位置

obj.end() 返回匹配结束的位置

obj.span()返回一个元组表示匹配的位置(开始,结束)

re.compile()对象不一定要创建,的看你的这个规则使用的次数多不多,如果你频繁的使用这个规则

还是创建一个对象,节省空间,提高效率,如果用的不多,match findall finditer search sub这些

也都是全局函数,两个参数,前者为规则,后者为待匹配的字符串

编译标志

A:

使得 \w,\W,\b,\B,\s 和 \S 只匹配 ASCII 字符,而不匹配完整的 Un

icode 字符。这个标志仅对 Unicode 模式有意义,并忽略字节模式

S

DOTALL

使得 . 可以匹配任何字符,包括换行符。如果不使用这个标志,. 将匹配除了换行符的所有字符。

I

IGNORECASE

字符类和文本字符串在匹配的时候不区分大小写。举个例子,正则表达式 [A-Z]

也将会匹配对应的小写字母,像 FishC 可以匹配 FishC,fishc 或 FISHC 等。如果你不设置

LOCALE,则不会考虑语言(区域)设置这方面的大小写问题。

L

LOCALE

使得 \w,\W,\b 和 \B 依赖当前的语言(区域)环境,而不是 Unicode 数据库。

区域设置是 C 语言的一个功能,主要作用是消除不同语言之间的差异。例如你正在处理的是法

文文本,你想使用 \w+ 来匹配单词,但是 \w 只是匹配 [A-Za-z] 中的单词,并不会匹配 ‘é’ 或

‘ç’。如果你的系统正确的设置了法语区域环境,那么 C 语言的函数就会告诉程序 ‘é’ 或 ‘

ç’ 也应该被认为是一个字符。当编译正则表达式的时候设置了 LOCALE 的标志,\w+ 就

可以识别法文了,但速度多少会受到影响。

M

MULTILINE

(^ 和 $ 我们还没有提到,别着急,后边我们有细讲…)

通常 ^ 只匹配字符串的开头,而 $ 则匹配字符串的结尾。当这个标志被设置的时候,^ 不仅匹配字符串的开头,还匹配每一行的行首;& 不仅匹配字符串的结尾,还匹配每一行的行尾。

X

VERBOSE

这个标志使你的正则表达式可以写得更好看和更有条理,因

为使用了这个标志,空格会被忽略(除了出现在字符类中和使用反斜杠

转义的空格);这个标志同时允许你在正则表达式字符串中使用注释,#

符号后边的内容是注释,不会递交给匹配引擎(除了出现在字符类中和使

用反斜杠转义的 #)。

分组的概念

(ab)*表示的是,ab的多次出现,而且分组的概念之后会有子组的概念,先不展开

    原文作者:认真的史莱冰
    原文地址: https://www.jianshu.com/p/b298161a3490
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞