07模式匹配正则表达式

正则表达式:regular expression,缩写是regex。
本章最后会有让你自动摘取文本中的电话号码和邮箱地址。

1.用正则表达式来寻找合适的电话号码:

三个发展阶段
用def定义函数—\d\d\d-\d\d\d\d-\d\d\d—\d{3}-\d{4}-\d{3}
其中\d代表数字0-9,就不需要再使用def再去筛选是否是数字了。
{ }在此表示,匹配之前的模式相对应的次数。

2.所有python中的regex在re中,所以要先import re

正则表达式
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
#这里的compile是什么意思?此句代表建立一个正则表达式。
mo = phoneNumRegex.search('My number is 415-555-4242.')
#这里的search指要搜索的对象,如果搜索不到对象则会返回none。
print('Phone number found: ' + mo.group())
#这里的group指对答案的集合???他明明不是集合为什么要用group

正则表达式的更多模式匹配

group模式
例如要将电话里的前半部分和后半部门分开来找,在此group(1)代表第一个(里的部分),group(0)和group()一样,都代表输出整个。groups()代表分别输出()里的内容并且按照格式。
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My number is 415-555-4242.')
mo.group(1)
'415'
mo.group(2)
'555-4242'
mo.group(0)
'415-555-4242'
mo.group()
'415-555-4242'
mo.groups()
('415', '555-4242')
areaCode, mainNumber = mo.groups()
print(areaCode)
415
print(mainNumber)
555-4242

PIPE管道模式

匹配多个正则表达式的时候可以用|连接,匹配到的第一个合适的内容会被输出,之后的就不会有输出了。

正则表达式如何输出多个结果?使用findall

用问号标记随机匹配的正则表达式
问号前的东西可以有也可以没有。

batRegex = re.compile(r'Bat(wo)?man')
mo1 = batRegex.search('The Adventures of Batman')
mo1.group()
'Batman'

mo2 = batRegex.search('The Adventures of Batwoman')
mo2.group()
'Batwoman'

用*匹配0或更多该内容的正则表达式

batRegex = re.compile(r'Bat(wo)*man')
mo1 = batRegex.search('The Adventures of Batman')
mo1.group()
'Batman'

mo2 = batRegex.search('The Adventures of Batwoman')
mo2.group()
'Batwoman'

mo3 = batRegex.search('The Adventures of Batwowowowoman')
mo3.group()

用+匹配1个或以上的标记内容的正则表达式

batRegex = re.compile(r'Bat(wo)+man')
mo1 = batRegex.search('The Adventures of Batwoman')
mo1.group()
'Batwoman'

mo2 = batRegex.search('The Adventures of Batwowowowoman')
mo2.group()
'Batwowowowoman'

mo3 = batRegex.search('The Adventures of Batman')
mo3 == None
True

用{ }匹配的特定重复的内容

比如匹配(ha){3},就是指匹配hahaha;
比如(ha){3,5},就是匹配3-5个ha
比如(ha){3,}匹配3个以及无限多的ha

但有个问题,在使用{3,5}时,匹配的结果总是出现5个ha的那个,这是因为系统的greedy,如果要让系统non-greedy(在此的意思就是输出的是3个ha的那种),需要变成另外一种格式,就是在{ }加上?。
注意,这边的?和(ha)?中的这个意义是不同的。

findall

  • 在使用re.compile search时,出现的结果都只有一个匹配项,如果想让所有匹配项都出现,需要用到findall。
  • 使用的时候不能再用group了,因为findall结果将会以列表的形势出现。
  • 要陈列匹配结果的时候,需要将原来的search改成findall。
  • 如果用findall,正则表达式中那个匹配公式是没有group的。

正则表达式中的代表字符缩写和其意义

Shorthand character class Represents
\d Any numeric digit from 0 to 9.
\D Any character that is not a numeric digit from 0 to 9.
\w Any letter, numeric digit, or the underscore character. (Think of this as matching “word” characters.)
\W Any character that is not a letter, numeric digit, or the underscore character.
\s Any space, tab, or newline character. (Think of this as matching “space” characters.)
\S Any character that is not a space, tab, or newline.

我们也可以自己做正则表达式的搜索范围,用[ ]中的内容表示

比如[a-z]代表所有的小写字母。如果将放在a的前面[a-z],代表是后面的反义词,代表只匹配除了[]里的其他内容。

限定开始和结束

如果将^ 放在字符串的前面,代表以xxxx开头的意思,比如r’^[a-z]’或者 r’^hello’。
如果是$放在字符串结尾,代表以什么为结束。
如果一个字符串里既有^又有$,代表整个字符串都必须是什么。

通配符

通配符“.”,这个代表可以匹配除换行以外的所有字符,但是只能匹配一个字符。

如果想匹配多一些的字符,可以使用“.*”,但也不包括匹配换行的。

如果想匹配换行的,可以调用re里的dotall。

noNewlineRegex = re.compile('.*')
noNewlineRegex.search('Serve the public trust.\nProtect the innocent.
\nUphold the law.').group()
'Serve the public trust.'
newlineRegex = re.compile('.*', re.DOTALL)
newlineRegex.search('Serve the public trust.\nProtect the innocent.
\nUphold the law.').group()
'Serve the public trust.\nProtect the innocent.\nUphold the law.'

符号复习Review of Regex Symbols

This chapter covered a lot of notation, so here’s a quick review of what you learned:
The ? matches zero or one of the preceding group.
The * matches zero or more of the preceding group.
The + matches one or more of the preceding group.
The {n} matches exactly n of the preceding group.
The {n,} matches n or more of the preceding group.
The {,m} matches 0 to m of the preceding group.
The {n,m} matches at least n and at most m of the preceding group.
{n,m}? or *? or +? performs a nongreedy match of the preceding group.
^spam means the string must begin with spam.
spam$ means the string must end with spam.
The . matches any character, except newline characters.
\d, \w, and \s match a digit, word, or space character, respectively.
\D, \W, and \S match anything except a digit, word, or space character, respectively.
[abc] matches any character between the brackets (such as a, b, or c).
[^abc] matches any character that isn’t between the brackets.

想要忽略大小写的匹配正则表达式
使用re.IGNORECASE或者使用re.I,作为re.compile()内部的第二个参数。

练习项目中为什么要加上r?
三个引号是什么意思?
pyperclip的用法?
为什么findall后面就不能用group(),只有search后面能跟group。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容