本文用几种情况讨论了正则表达式循环消除优化、Python中的点通配模式、整行读出方法。
本文源于一个Non-Trivial程序,从蛋白质语料库中提取出蛋白质词组。如第一行中的<prot><pro>bradykinin B(1)</prot><prot><pro>bradykinin B(1)</prot> 就是一个带嵌套的蛋白质词组的例子。为了说明问题,我在<prot>bradykinin B(1)</prot> 中人为加入了干扰因素<prot><pro>bradykinin B(1)</prot> 。
# -*- coding: utf-8 -*- import re #=============================================================================== # 1.不换行模式 # 通过()和首尾的''',实际组成了一个不换行的长字符串 #=============================================================================== fillWidth = 80 str = ('''<ArticleTitle><prot><prot>p38</prot> stress-activated protein kinase</prot> ''' '''inhibitor reverses <prot><pro>bradykinin B(1)</prot> receptor-mediated ''' '''component of inflammatory hyperalgesia.</ArticleTitle>''') def DoMatch(reg, str): print ">>>Result(s):" match = reg.findall(str) for each in match: print each print u'不换行模式'.center(fillWidth, "*") #=============================================================================== # 1.1.只考虑最简单的情况:即<prot>不含'<'或者'>'</prot> #=============================================================================== print u'只考虑最简单的情况'.center(fillWidth, '-') reg0 = re.compile(r'''<prot>([^<]+)</prot>''', re.I) DoMatch(reg0, str) #=============================================================================== # 1.2.考虑<prot>中可以有'<'或者'>'的情况 #=============================================================================== reg1 = re.compile( r''' <prot> ( #捕获a (?: #非捕获b (?!</?prot) #否定顺序环视 . #非<prot和非</prot,则一切均可 )* #b ) #a </prot> ''', re.I | re.X) print u"考虑<prot>中可以有'<'的情况".center(fillWidth, '-') DoMatch(reg1, str) #=============================================================================== # 1.3.考虑<prot>中可以有'<'或者'>'的情况,并优化 # 即normal* (special normal*)*型消除循环 #=============================================================================== reg2 = re.compile( r''' <prot> ( #捕获a [^<]* #normal (?: #非捕获b (?!</?prot) #否定顺序环视 < #special [^<]* #normal )* #b ) #a </prot> ''', re.I | re.X) print u"考虑<prot>中可以有'<'的情况,并优化".center(fillWidth, '-') DoMatch(reg2, str) print "*" * fillWidth print u'换行模式'.center(fillWidth, "*") #=============================================================================== # 2.分行模式,并考虑<prot>中可以有'<'或者'>'的情况 # 人为加上换行符,切分成为若干行 # 结果可以看出只考虑**不优化且非点通配**的做法无法应付分行模式 #=============================================================================== str = ''' <ArticleTitle> <prot> <prot> p38 </prot> stress-activated protein kinase </prot> inhibitor reverses <prot> <pro>bradykinin B(1) </prot> receptor-mediated component of inflammatory hyperalgesia. </ArticleTitle> ''' print u'只考虑最简单的情况'.center(fillWidth, '-') DoMatch(reg0, str) print u"非点通配模式:考虑<prot>中可以有'<'的情况".center(fillWidth, '-') DoMatch(reg1, str) reg3 = re.compile( r''' <prot> ( #捕获a (?: #非捕获b (?!</?prot) #否定顺序环视 . #非<prot和非</prot,则一切均可 )* #b ) #a </prot> ''', re.I | re.X | re.S) print u"点通配模式:考虑<prot>中可以有'<'的情况".center(fillWidth, '-') DoMatch(reg3, str) print u"考虑<prot>中可以有'<'的情况,并优化".center(fillWidth, '-') DoMatch(reg2, str) print '-' * fillWidth #=============================================================================== # 3.附上Python将整个文件读成一个整体字符串的方法 # readall()的结果与最后一个str相同 #=============================================================================== import io file = io.FileIO(r'D:/DNA/prot/abstract1-1', 'r') #print file.readall() file.close()
输出结果:
*************************************不换行模式**************************************
-----------------------------------只考虑最简单的情况------------------------------------
>>>Result(s):
p38
-------------------------------考虑<prot>中可以有'<'的情况-------------------------------
>>>Result(s):
p38
<pro>bradykinin B(1)
-----------------------------考虑<prot>中可以有'<'的情况,并优化-----------------------------
>>>Result(s):
p38
<pro>bradykinin B(1)
********************************************************************************
**************************************换行模式**************************************
-----------------------------------只考虑最简单的情况------------------------------------
>>>Result(s):
p38
---------------------------非点通配模式:考虑<prot>中可以有'<'的情况----------------------------
>>>Result(s):
----------------------------点通配模式:考虑<prot>中可以有'<'的情况----------------------------
>>>Result(s):
p38
<pro>bradykinin B(1)
-----------------------------考虑<prot>中可以有'<'的情况,并优化-----------------------------
>>>Result(s):
p38
<pro>bradykinin B(1)
>>>