正则表达式

re模块概述

import re

re.match     re.seach      re.findall

# pip 包管理工具

"""

re.match函数

原型:match(pattern, string, flags=0)

参数:

patter:匹配的正则表达式

string:要匹配的字符串

flags:标志位,用于控制正则表达式的匹配方式,值如下

          re.I  忽略大小写

          re.L  做本地化识别

          re.M  多行匹配,影响^和$

          re.S  识.匹配包括换行符在内的所有字符

          re.U  根据Unicode字符集解析字符,影响 \w \ W  \b \B

          re.X  s使我们以更灵活的格式理解正则表达式

功能:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回None

"""

# www.baidu.com  查找www

print(re.match('www', 'www.baidu.com ').span())            # .span 打印的是字符串所在的位置

print(re.match('www', 'ww.baidu.com '))                          # 打印www

print(re.match('www', 'baidu.wwwcom '))                        # 从起始位置开始匹配,只打印第一个www

print(re.match('wwW', 'www.baidu.com '))                       # 返回None 区分大小写,未匹配到字符

print(re.match('wwW', 'www.baidu.com ', flags=re.I))      # 返回wwW  (flags=re.I)  不区分大小写

# 扫描整个字符串,返回从起始位置成功的匹配

print('-----------------------------------')

'''

re.search函数

原型:search(pattern, string,flags=0)

参数:

patter:匹配的正则表达式

string:要匹配的字符串

flags:标志位,用于控制正则表达式的匹配方式

功能:扫描整个字符串,并返回第一个匹配成功的

'''

print(re.search('sunck', 'good man is sunck!sunck is nice'))# 返回第一个匹配成功的,不用从起始位置开始匹配

'''

re.findall

原型:search(pattern, string,flags=0)

参数:

patter:匹配的正则表达式

string:要匹配的字符串

flags:标志位,用于控制正则表达式的匹配方式

功能:扫描整个字符串,并返回结果列表

'''

print(re.findall('sunck', 'good man is sunck!sunck is nice'))   # 返回2个sunck


正则表达式的元字符

import re

(pattern, string, flags=0)

print('-------匹配单个字符串--------')

只会匹配第一个字符

r'''

.                                     匹配除换行符以外的任意字符

[0123456789]                []是字符集合,表示匹配方括号中所包含的任意一个字符

[sunck]                           匹配's','u','n',c','k' 中任意一个字符

[a-z]                                匹配任意小写字母

[A-Z]                               匹配任意大写字母

[0-9]                               匹配任意数字 

[0-9a-zA-Z]                    匹配任意的数字和字母

[0-9a-zA-Z_]                  匹配任意的数字,字母和下划线

[^sunck]                         匹配除了sunck这几个字符以外的所有字符,中括号里的^号称为脱字符,表示不匹配集合                                        中的字符

[^0-9]                             匹配所有的非数字字符

\d                                   匹配数字,效果同[0-9]

\D                                   匹配非数字字符,效果同[^0-9]

\w                                   匹配数字,字母和下划线,效果同[0-9a-zA-Z_]

\W                                  匹配非数字,字母和下划线,效果同[^0-9a-zA-Z_]

\s                                    匹配任意的空白字符(空格,换行,换页,制表,回车)效果同[ \f\n\r\t]

\S                                   匹配任意非空白符,效果同[^ \f\n\r\t]

'''

print(re.search('.', 'i am a good boy'))                                # 打印i      i为任意字符

print(re.search('[0123456789]', 'i am a good boy 5'))        # 打印5     匹配0-9中的任意数字

print(re.findall('[^boy]', 'i am a good boy 5'))                      # 打印i a m等等     打印除boy以外的所有字符  

print(re.findall('\d', 'i a3m a goo4d boy 5'))                             # 打印3,4,5     打印所有数字 

print('-----------锚字符(边界字符)-------------')

'''

^        行首匹配,和在[]里的^不是一个意思,会匹配每一行的行首

$       行尾匹配

\A      匹配字符串开始,它和^区别是\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配他行的行首

\Z      匹配字符串结束,它和$区别是\A只匹配整个字符串的结束,即使在re.M模式下也不会匹配他行的行尾

\b      匹配一个单词的边界,也就是值单词和空格间的位置

         'er\b'可以匹配never,因为er为这个单词的边界,不能匹配nerve,因为er不是这个单词的边界

\B      匹配非单词边界

         'er\B'可以匹配nerve,因为er非这个单词的边界,不能匹配never,因为er是这个单词的边界

'''

print(re.search('xh$', 'xh is a good boy'))          # 结尾不是xh 打印none

print(re.search('boy$', 'xh is a good boy'))        # 结尾为boy  打印boy

print(re.search('^xh', 'xh is a good boy'))          # 以xh开头 打印xh

print(re.findall('^xh', 'xh is a good boy\nxh is cool', re.M))        # 会打印2个xh  因为2个xh都是行首  re.M为多行匹                                                                                                       配

print(re.findall('\Axh', 'xh is a good boy\nxh is cool', re.M))       # 只会打印一个xh  \A 代表匹配整个字符串开头

print(re.search(r'er\b', 'never'))     # 打印er       因为er为这个单词的边界    r为取消转义字符

print(re.search(r'er\b', 'nerve'))     # 打印None  因为er非这个单词的边界

print(re.search(r'er\B', 'never'))     # 打印None  因为er为这个单词的边界

print(re.search(r'er\B', 'nerve'))     # 打印er       因为er非这个单词的边界


print('-------匹配多个字符-------')

'''

说明:下方的x,y,z均为假设的普通字符(n,m)为非负整数,不是正则表达式的元字符

(xyz)         匹配小括号内的xyz(作为一个整体去匹配)

x?             匹配0个或者1个x

x*             匹配0个或者任意多个x

x+            匹配至少一个x

x{n}          匹配确定的n个x (n为一个非负整数)

x{n,}         匹配至少n个x

x{n,m}      匹配至少n个最多m个x 注意n<=m

x|y            匹配的x或y

'''

print(re.findall('(xh)', 'xh is a good boy and xh is so cool'))   #匹配到2个xh 均为整体['xh', 'xh']

print(re.findall('[xh]', 'xh is a good boy and xh is so cool'))    #匹配到4个字符  ['x', 'h', 'x', 'h']

print(re.findall('a?', 'aaa'))         # 打印0个或者1个a,['a', 'a', 'a', '']

print(re.findall('a*', 'aaa'))          # 打印0个或者多个a,['aaa', '']

print(re.findall('a*', 'aaavdaa'))  # 打印0个或者多个a,['aaa', '', '', 'aa', '']

print(re.findall('.*', 'aaavdaa')) #打印0个或者任意个字符 ,['aaavdaa', '']

print(re.findall('a+', 'aaavdaa'))  # 打印至少一个a ,['aaa', 'aa']  不会去匹配空字符

print(re.findall('a{3}', 'aaavdaatjeaaaa'))       # 打印3个a字符 ['aaa', 'aaa']

print(re.findall('a{2,}', 'aaavdaatjeaaaawa'))    # 打印至少为2个以上的字符['aaa', 'aa', 'aaaa']

print(re.findall('a{2,4}', 'vdaatjeaaaawaaaveuogbaaafresfa'))       # 打印至少2个最多4个a字符['aa', 'aaaa', 'aaa', 'aaa']

print(re.findall(r'((s|S)unck)', 'sunck--Sunck---Sundf'))  打印S或者s开头的sunck单词 #[('sunck', 's'), ('Sunck', 'S')]


print('---------------特殊----------------')

'''

*?  +?  (xyz)?  表示最小匹配  通常都是尽可能多的匹配,可以使用这种解决贪婪匹配

(?:x)                类似(xyz),但它不表示一个组

'''


# 提取sunck********man,

str ='sunck is a good man!sunck is a nice man!sunck is a very handsome man'

print(re.findall(r'sunck.*?man', str))

<<<['sunck is a good man', 'sunck is a nice man', 'sunck is a very handsome man']


# 注释:/* part1 */ /* part2 */

print(re.findall(r'//*.*?/*/', r' /* part1 */    /* part2 */'))

<<<['/* part1 */', '/* part2 */']




'''

切割字符

'''

str1 ='i am a good boy'

print(str1.split(' '))           # 以空格作为切割符,多个空格连接在一起时无法使用

print(re.split(r' +', str1))   # 以至少一个空格作为切割符


"""

字符串的替换和修改

sub(pattern,repl,string,count=0,flags=0)

subn(pattern,repl,string,count=0,flags=0)

pattern: 正则表达式

repl:  指定的用来替换的字符串

string: 目标字符串

count:最多替换次数

功能:在目标字符串中以正则表达式的规则匹配字符串,再把他们替换成指定的字符串。可以指定替换的次数,如果不指定,会替换所有的匹配字符串。

区别:前者返回一个被替换的字符串,后者返回一个元组,第一个元素被替换的字符串,第二个元素表示被替换的次数

"""

str1 ='xh is a good boy'

print(re.sub(r'(good)', 'nice', str1))     # 打印的类型为str  <<<xh is a nice boy

print(re.subn(r'(good)', 'nice', str1))   # 打印的类型为tuple,并会告知修改了多少次 <<<('xh is a nice boy', 1)


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

推荐阅读更多精彩内容