[Python]正则表达式

  • group(0) 就等于group()是匹配的整体结果,第一个小括号里面的匹配是从group(1)开始算起的
  • \w匹配 匹配非特殊字符,即a-zA-Z0-9_汉字,但是.是匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符,因为我们的匹配中要匹配.所以不使用\w
with open(FILEPATH,'r') as file:
    for index,line in enumerate(file):
        lineSearch=re.search("/a/\[/r/(.+)/,/c/en/(.+)/.*,/c/en/(.+)/\]",line)
        if lineSearch!=None and lineSearch.group(1)!=None and lineSearch.group(2)!=None:
            print(lineSearch.group(2),' ',lineSearch.group(3))

使用懒惰匹配+?或者'*?'目的是匹配到第一个字符就终止,比如下面例子中因为懒惰匹配后面是一个/所以他匹配到第一个/就停止了,所以是懒惰匹配。如果不加?是贪婪匹配他会匹

/(.+?)/.*

re.DOTALL的用法

  • 当我们需要希望使用.来匹配任意字符时,但是.是不能匹配换行符'\n'的,因此可以设置flag=re.DOTALL来匹配换行符.
import re
comment = re.compile(r'/\*(.*?)\*/')  # 匹配C的注释
text1 = '/* this is a comment */'
text2 = """/*this is a 
    multiline comment */"""

comment.findall(text1)
Out[4]: [' this is a comment ']

comment.findall(text2)  # 由于text2文本换行了,没匹配到
Out[5]: []
  • 解决方法一:添加对换行符的支持,(?:.|\n)指定了一个非捕获组(即,这个组只做匹配但不捕获结果,也不会分配组号)
comment = re.compile(r'\*((?:.|\n)*?)\*/') 
comment.findall(text2)
Out[7]: ['this is a \n    multiline comment ']
  • 解决方法二:设置flag=re.DOTALL使得.可以用来匹配换行符
comment = re.compile(r'/\*(.*?)\*/', flags=re.DOTALL)
comment.findall(text2)
Out[10]: ['this is a \n    multiline comment ']

?: ?= ?<

  • 前瞻: 查找exp2前面的exp1
exp1(?=exp2)  
  • 后顾:查找exp2后面的exp1
(?<=exp2)exp1 
  • 负前瞻:查找后面不是exp2exp1
exp1(?!exp2) 
  • 负后顾:查找前面不是exp2exp1
(?<!=exp2)exp1 
  • 例子:这个应用经常见,比如我们要匹配被这个格式保卫的目标字符串<start>字符串<end>
>>> m = re.search(r'(?<=-)\w+', 'spam-egg')
>>> m.group(0)
'egg'
  • ?:是匹配但是不捕获结果

一些函数的用法

  • re.search()因为可能匹配不到,所以一般要判断一下
str = 'an example word:cat!!'
match = re.search(r'word:\w\w\w', str)
if match:
    print 'found', match.group() ## 'found word:cat'
else:
    print 'did not find'
>>> found word:cat
  • []类似于or
match = re.search(r'[\w.-]+@[\w.-]+',string)
if match:
    print match.group()
>>> alice-b@gmail.com
  • findall:返回的是a list of tuples
str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher'
tuples = re.findall(r'([\w\.-]+)@([\w\.-]+)', str)
print tuples  # [('alice', 'google.com'), ('bob', 'abc.com')]
for tuple in tuples:
    print tuple[0] # username
    print tuple[1] # host

>>> [('alice', 'google.com'), ('bob', 'abc.com')]
alice
google.com
bob
abc.com
  • re.subre.sub(pat, replacement, str)str里寻找和pat匹配的字符串,然后用replacement替换。replacement可以包含\1或者\2来代替相应的group,然后实现局部替换。
# replace hostname
str = 'alice@google.com, and bob@abc.com'
#returns new string with all replacements,
# \1 is group(1), \2 group(2) in the replacement
print re.sub(r'([\w\.-]+)@([\w\.-]+)', r'\1@yo-yo-dyne.com', str)
>>> alice@yo-yo-dyne.com, and bob@yo-yo-dyne.com

速记表

  • 元字符不匹配自己,若想匹配自己要加上转义字符。


正则表达式字符串前面的

  • Python中字符串前面加上r 表示原生字符串。

与大多数编程语言相同,正则表达式里使用"\"作为[转义字符],这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

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

推荐阅读更多精彩内容

  • python的re模块--细说正则表达式 可能是东半球最详细最全面的re教程,翻译自官方文档,因为官方文档写的是真...
    立而人阅读 22,824评论 4 46
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 3,974评论 0 13
  • 搞懂Python 正则表达式用法 Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一...
    厦热阅读 1,562评论 0 2
  • #首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用法 环视用法...
    mapuboy阅读 1,591评论 0 51
  • 尼罗大大真是厉害,三言两语就可以刻画一个满不在乎的公子哥,就是笨。美型受是不缺的,也许是情人眼里出西施,反正大大文...
    叶开开阅读 1,883评论 0 1