正则表达式

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。
推荐学习30分钟入门教程(ps:当然你可能不止花费30分钟-):http://deerchao.net/tutorials/regex/regex.htm
Python堆正则表达式的支持:

compile

compile(pattern, flags=0)
编译正则表达式返回正则表达式对象

match

match(pattern, string, flags=0)
用正则表达式匹配字符串,匹配成功返回匹配对象,否则返回None。从第一个字符开始匹配。

search

search(pattern, string, flags=0)
搜索字符串中第一次出现正则表达式的模式,匹配成功返回匹配对象,否则返回None,可以从任意位置开始匹配。

findall 和 finditer

findall(pattern, string, flags=0)
查找字符串所有与正则表达式匹配的模式,并返回一个列表。
finditer(pattern, string, flags=0)
查找字符串所有与正则表达式匹配的模式,并且返回一个迭代器。span返回匹配的位置,group返回匹配的内容。
下面这个实例是查找出字符串中所有的电话号码,用findall 和 finditer 两种方式查找

import re


def phone_num():
    patter1 = re.compile(r'(?<=\D)1[345789]\d{9}(?=\D)')
    sentence = '重要的事情说8130087690870遍,我的手机号是13567672929,不是13789890976!'
    # 找出所有匹配的内容 返回一个列表
    my_list = patter1.findall(sentence)
    print(my_list)
    # iter - iterator 迭代器
    for temp in patter1.finditer(sentence):
        print(temp)
        print(temp.span())
        print(temp.group())

if __name__ == '__main__':
    phone_num()

sub

sub(pattern, repl, string, count=0, flags=0)
用指定的字符串替换原字符串中与正则表达式匹配的模式,
patter需要替换的字符,repl用作替换的内容,string指定的字符串,count指定替换的次数,flags设置是否忽略大小写。

import re


def main():
    sentence = '马化腾傻逼操你大爷fuck你'
    # 内容替换
    # 正则表达式 替换符 替换的内容 是否忽略大小写
    pure = re.sub('[操草艹]|傻逼|fuck|马化腾', '*', sentence, flags=re.IGNORECASE)
    print(pure)

if __name__ == '__main__':
    main()

注意:替换符可以是字符/字符串/可调用的函数,下面这个例子的替换内容就是一个函数。

from re import sub


def foo(mo):
    # mo - 匹配对象
    # group返回匹配的对象,传入参数foo1,这是一个组名,返回此组的匹配的内容
    # mo.group('foo1') - 返回名称为foo1组里的文本
    value = int(mo.group('foo1'))
    return str(value ** 2)


def main():
    sentence = 'fgkfshf12hdjsh876hdf962hf'
    # (?P<foo1>\d+) 匹配一个或多个数字,并捕获文本到名称为foo1的组里
    # 注意:Python中必须加上P
    print(sub(r'(?P<foo1>\d+)', foo, sentence))


if __name__ == '__main__':
    main()

运行结果:字符串中所有的数字都被替换成了其平方

fgkfshf144hdjsh767376hdf925444hf

split

split(pattern, string, maxsplit=0, flags=0)
patter拆分依据,string指定的字符串,flags设置是否忽略大小写。

def main():
    sentence1 = 'you go your way, i will go home!'
    # 按照空白符字符拆分
    mylist = re.split(r'[ ,!]', sentence1)
    print(mylist)


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

推荐阅读更多精彩内容