2

嗨,我正在寻找一种使用正则表达式用 Python 提取文本文件的一部分的方法:这是我的代码:

    texfile=open("texte.txt", "r")
        for line in texfile:
            if re.match("^text(.*)", line):
               print line,

我正在搜索单词 text 之后的文本,直到它到达段落末尾或到达空格时,但我的代码仅返回 1 行上的单词“text”之后的单词。

例如 :

bla bla hhhhhhhh text bla blajjjjjjjjjjjjjjjjjjjjj
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
ffff

必须返回:

bla blajjjjjjjjjjjjjjjjjjjjj
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
ffff

谢谢我尝试了你所有的代码,但没有人能像我想要的那样工作:我现在想简单地渲染它,提取遵循某个“文本”的流,直到它到达一个空行:

          text
    sssssssssssssssss
     ssssssss
    kkkk
    lllmmm

    kkkk

   ;must return 
    sssssssssssssssss
    ssssssss
    kkkk
    lllmmm
    ;because of the blank line
4

3 回答 3

1

如果你想检测一个文件的一部分在多行上扩展,并且如果文件不是太大,那么通过一次检查一行来限制正则表达式的能力并不是一个特别好的方法。当文件可以被读取并完全放入 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)

此代码给出与前一个相同的结果。你看它不那么简单。那是因为大文件更成问题。

于 2012-11-28T03:01:02.667 回答
1

如果您没有被迫使用正则表达式,则可以使用它...

将文件加载为列表:

with open("texte.txt", "r") as fileInput:
    listLines = fileInput.readlines()

获取包含您的关键字的行的索引,如果它多次存在您可能无法获得预期的结果,但这是一个简单的修复:

listIndex = [i for i, item in enumerate(listLines) if "text" in item]

通过对列表进行切片,这是关键字后面没有空行的行:

lines = [line for line in listLines[listIndex[0]:] if line]

您可能希望获得关键字后面的任何文本:

lineMatched = listLines[listIndex].split("text")[1].strip()

& 打印结果:

print "\n".join([lineMatched] + lines if lineMatched else lines)
于 2012-12-05T11:51:57.497 回答
1

这在 python3 中对我有用:

for line in texfile:
    x = re.search("(.*?)(text)", line)
    try:
        print (x.group(1))
    except:
        print(line)
于 2012-11-27T23:10:37.300 回答