2

こんにちは、正規表現を使用して Python でテキスト ファイルの一部を抽出する方法を探しています。これが私のコードです。

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

テキストという単語に続くテキストが段落の終わりに到達するまで、または空白に到達するまで探していますが、コードは「テキスト」という単語に続く単語を 1 行で返します。

例えば ​​:

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

これはpython3で私のために働いた:

for line in texfile:
    x = re.search("(.*?)(text)", line)
    try:
        print (x.group(1))
    except:
        print(line)
于 2012-11-27T23:10:37.300 に答える
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

複数の行にまたがるファイルの一部を検出したい場合、およびファイルがそれほど巨大でない場合、一度に 1 行ずつ調べることによって正規表現の能力を制限するのは特に良い方法ではありません。ファイルを読み取って全体を RAM に配置できる場合は、テキストを一意の全体として探索する正規表現を使用して分析することをお勧めします。

フラグが使用されていない場合は「文字列の先頭」、このフラグが使用されている場合は「行の先頭」'^'に意味があることに注意してください。re.MULTILINE

ちなみに、この方法を使えばREパターンの先頭match()に追加する必要はありません。文字列の先頭からマッチさせようとするからです。"^"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 の 1 つのチャンクだけで充電できない場合は、次のようにできます。

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 に答える