簡體   English   中英

如何使用正則表達式從文件中提取文本?

[英]How can I extract text from a file using regex?

嗨,我正在尋找一種使用正則表達式使用Python提取文本文件的一部分的方法:這是我的代碼:

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

我一直在尋找單詞text之后的文本,直到到達段落末尾或到達空白為止,但是我的代碼只返回一行中緊隨單詞“ 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

如果要檢測文件擴展成幾行的一部分,並且文件不是太大,那么通過一次檢查一行來限制正則表達式的功能不是一個特別好的方法。 當可以讀取文件並將其完全放入RAM時,最好使用正則表達式對文件進行分析,以將文本視為一個唯一的整體。

請注意,如果不使用標志re.MULTILINE ,則'^'含義為“字符串的開頭” ,而如果使用此標志,則其re.MULTILINE“行的開頭”

順便說一句,如果使用match()方法,則不需要在RE模式的開頭添加"^" ,因為match()嘗試從字符串的最開始進行匹配。

因此,這是一種分析整個文本的方式(我使用splitlines(True)來獲取字符串ss splitlines(True)的列表,該列表模擬了一個文件°:

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)

此代碼與前一個代碼具有相同的結果。 您會發現它不那么簡單。 那是因為大文件更大的問題。

這在python3中對我有用:

for line in texfile:
    x = re.search("(.*?)(text)", line)
    try:
        print (x.group(1))
    except:
        print(line)

如果您不被迫使用正則表達式,則可以使用此...

將該文件作為列表加載:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM