如果你想检测一个文件的一部分在多行上扩展,并且如果文件不是太大,那么通过一次检查一行来限制正则表达式的能力并不是一个特别好的方法。当文件可以被读取并完全放入 RAM 中时,最好使用正则表达式来分析它,将文本作为一个独特的整体来探索。
请注意,如果不使用标志,'^'
则表示“字符串的开头”,如果使用此标志,则表示“行的开头”。re.MULTILINE
顺便说一句,如果您使用该match()
方法,则无需"^"
在 RE 模式的开头添加,因为match()
尝试从字符串的最开头进行匹配。
因此,这是一种按照您的需要分析整个文本的方法(我splitlines(True)
用来获取字符串ss中的行列表,此列表模拟文件°:
import re
ss = """ first line
bli bli hhhhhhhh TEXT bla blajjjjjjjjj
hhhhhhhh VVVVV
ZZZZZZ
tttt
bolo bolo TEXTrumunu and badad
yyyyyyyyyyyyyyyy
kkkkkkkkkkk
jjjjjjjjjjjjjjj
nnnn uytr
poiurrr
ahahahah bobobo
ppppp TEXT aaaabbbbb cccccg
kmsms
TEXT fedex redex bidex
pududadi
A
no-whitespace-before-that
hhrhezipo"""
regx = re.compile('TEXT *(.+(?<! )(?<!\r)(?:\n[^ ]+(?<!\n))?)')
for fnd in regx.findall(ss):
print '\n'.join(map(repr,fnd.splitlines(True)))
print '---------------------------------'
结果:
'bla blajjjjjjjjj\n'
'hhhhhhhh'
---------------------------------
'rumunu and badad\n'
'yyyyyyyyyyyyyyyy\n'
'kkkkkkkkkkk\n'
'jjjjjjjjjjjjjjj'
---------------------------------
'aaaabbbbb cccccg'
---------------------------------
'fedex redex bidex\n'
'pududadi\n'
'A\n'
'\n'
'no-whitespace-before-that'
---------------------------------
.
如果文件很大并且不能仅在 RAM 中的一个块中收费,您可以执行以下操作:
import re
ss = """ first line
bli bli hhhhhhhh TEXT bla blajjjjjjjjj
hhhhhhhh VVVVV
ZZZZZZ
tttt
bolo bolo TEXTrumunu and badad
yyyyyyyyyyyyyyyy
kkkkkkkkkkk
jjjjjjjjjjjjjjj
nnnn uytr
poiurrr
ahahahah bobobo
ppppp TEXT aaaabbbbb cccccg
kmsms
TEXT fedex redex bidex
pududadi
A
no-whitespace-before-that
hhrhezipo"""
rigx = re.compile('TEXT *(.+\n?)')
li = []
for line in ss.splitlines(True):
mat = rigx.search(line)
if 'TEXT' in line:
li.append(mat.group(1))
elif ' ' in line and li:
if not line.startswith(' '):
li.append(line.split(' ')[0])
li[-1] = li[-1].rstrip(' \r\n')
print '\n'.join(map(repr,li))
print '====================='
li = []
elif li:
li.append(line)
此代码给出与前一个相同的结果。你看它不那么简单。那是因为大文件更成问题。