2019-03 Python正则表达式复习

1. 常见的函数

  1. re.match函数、re.search函数相比:search函数匹配的是全局的一次,而match是只匹配字符串的开始的一次,如果字符串开始不符合正则表达式,则匹配失败
s="12abc345ab"
m=re.match(r'\d{3,}',s)
print m    ## answer: None

m=re.search(r'\d{3,}',s)
print m.group()  ## answer: 345
  1. re.sub函数、re.subn函数(返回一个元组 (新字符串,替换次数) )
s="2004-938-323 # 市第十三ds大师级 "
num=re.sub(pattern=r'#.*$', repl='', string=s)  ## $表示字符的末尾,.*$表示匹配到末尾
print num  ## answer: 2004-938-323
num=re.sub(pattern=r'\D', repl='', string=s)  ## D表示非数字字符,大写的字母都是小写字母的反义
print num  ## answer: 2004938323
num=re.sub(pattern=r'\d', repl='', string=s)  ## d表示数字字符
print num  ## answer: -- # 市第十三ds大师级

def replace_func(matched):
    print matched.group()
    return "*" * len(matched.group())
s = "abc,123,ef"
num = re.sub(pattern=r'[a-z]+', repl=replace_func, string=s)
print num
## answer: abc
##         ef
##         ***,123,**
  1. re.compile函数
  2. findall函数 (匹配的所有子串,并返回一个列表)
  3. re.split函数 (用pattern做分隔符切分字符串,分割后返回列表)
s = "dog,dog,cat. "
print re.split(r'\W+', s) ## pattern=\W 表示非字母数字及下划线
                          ## answer: ['dog', 'dog', 'cat', '']
print re.split(r'(\W+)', s) ## (pattern)=(\W)表示连带分隔符一起返回
                            ## answer:['dog', ',', 'dog', ',', 'cat', '. ', '']

小结一下: 函数re.finditer 、re.match、re.search 返回匹配对象,而findall、split返回列表。

2. re.compile函数(生成一个 Pattern 对象,也就是对正则表达式进行编译)

## match
pattern = re.compile(r"([a-z]+) ([a-z]+)", re.I)    
m = pattern.match('hello nice world.')
print m.groups()   ## answer: ('hello', 'nice')
print m.group()    ## answer:  hello nice

## sub
pattern = re.compile(r"(\w+) (\w+)") ## \w可以匹配一个字母或数字, ()表示一个分组
s = "ni 123, hao 456"
m = pattern.sub(r'\2 \1', s)
print m      ## answer: 123 ni, 456 hao

小结:如果一个正则表达式要用多次,那么出于效率考虑,我们可以预先编译正则表达式,然后调用的一系列函数时复用。如果直接使用re.match、re.search等函数,则需要每一次都对正则表达式进行编译,效率就会降低。

3. 贪恋匹配

  正则表达式匹配时默认的是贪恋匹配,也就是会尽可能多的匹配更多字符。如果想使用非贪恋匹配,可以在正则表达式中加上'?'。

s = 'a<exp>hello world</exp>bbb<exp>ni hao</exp>ccc'
pattern = re.compile(r'<exp>.*</exp>')
print pattern.findall(s)  ## answer: ['<exp>hello world</exp>bbb<exp>ni hao</exp>']

pattern = re.compile(r'<exp>.*?</exp>')
print pattern.findall(s)  ## answer: ['<exp>hello world</exp>', '<exp>ni hao</exp>']

4. 分组

  如果你想要提取子串或是想要重复提取多个字符,那么你可以选择用定义分组的形式。用()就可以表示要提取的分组(group)。

pattern = re.compile(r'(\d{1,3}\.){3}\d{1,3}')  ## '(\d{1,3}\.){3}'表示匹配一个长度为1到3之间的数字子串加上一个英文句号的字符串,重复匹配 3 次该字符串,'\d{1,3}'表示匹配一个1到3位的数字子串
s = 'ab123.456.78.90c'
print pattern.search(s).group()  ## answer: 123.456.78.90

5. 正则表达式修饰符

  1. re.I :忽略大小写
  2. re.L :
  3. re.M:多行匹配
  4. re.S:单行匹配
  5. re.U:
  6. re.X:忽略多余空白字符

6. 常用语句

匹配中文表达式
pattern = re.compile(r'[^\u4e00-\u9fa5]+')
s = u'你好, hello, 世界 1'
print pattern.findall(s)

参考文献:

长文详解python正则表达式
廖雪峰正则表达式
字符串含义

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

推荐阅读更多精彩内容

  • Python中的正则表达式(re) import rere.match #从开始位置开始匹配,如果开头没有则无re...
    BigJeffWang阅读 7,081评论 0 99
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 4,009评论 0 13
  • 搞懂Python 正则表达式用法 Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一...
    厦热阅读 1,582评论 0 2
  • #首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用法 环视用法...
    mapuboy阅读 1,609评论 0 51
  • 据报道,38岁女星吴佩慈与男友纪晓波已育有一儿一女,女儿小蕊蕊3岁、儿子汉斯1岁。今日,她证实已怀第3胎7个月,预...
    未来超越梦想阅读 212评论 0 1