2

コードの一部に対してさまざまなタスクを実行するプログラムをPythonで作成しようとしています。私はこれらのほとんどを実行しましたが、1つは私を困惑させています。この問題を解決するための効果的な検索を実行するための専門用語が十分にわからないため、ここで質問します。

括弧の間にあるものを単一の「ブロック」として読み取るプロセスを作成する必要があります。次に、「ブロック」に特定の単語またはフレーズが含まれている場合、Pythonコードはそれを削除します。

例(簡略化)テキストファイルの内容:

...
entity
{
    "id" "38794"
    "classname" "info_player_teamspawn"
}
entity
{
    "id" "38795"
    "classname" "func_detail"
    solid
}
entity
{
    "id" "38796"
    "classname" "path_track"
}
...

この例では、これらのエンティティが何千もリストされています。Pythonコードで、「solid」という単語を含む括弧内のすべて(および「entity」の序文を含む)を削除する必要があります。つまり、次のようになります。

...
entity
{
    "id" "38794"
    "classname" "info_player_teamspawn"
}
entity
{
    "id" "38796"
    "classname" "path_track"
}
...

IDを修正する必要はありません。それについて心配する必要はありません。

私は自分の問題を十分に説明し、可能な解決策があることを願っています。誰かが専門用語のライブラリを希望する場合は、私が抱えている可能性のあるさらなる問題の説明や調査に役立てることができます。それもありがたいです。

よろしくお願いします!

4

5 に答える 5

1

単一の正規表現を使用してすべてを実行することが可能です。ただし、特に複数の行にまたがると、すぐに判読できなくなります(また、他のパターンを削除したい場合もあると思います)。

私は問題を2つに分けます:

まず、次の正規表現を使用してすべてのエンティティブロックを見つけます。

p = re.compile(r'entity\s*{(.*?)}')

次に、置換を行う置換関数を定義します。

def remove_solid(match):
    text = match.groups(0)
    if text.find('solid') != -1:
        return ''
    else
        return text 

このようにこれら2つを一緒にフックします

output = p.sub(remove_solid, input)
于 2012-10-17T09:13:40.613 に答える
1

まず、タイトル(「エンティティ」)とそれぞれのブロックを生成するジェネレータを作成しましょう。

def blocks(filename):
    title, block = '', None
    with open(filename) as fp:
        for line in fp:
            if '{' in line:
                block = line
            elif block is not None:
                block += line
            else:
                title = line
            if '}' in line:
                yield title, block
                title, block = '', None

次に、ブロックを読み取り、テストに合格したブロックを出力します。

for title, block in blocks('input.txt'):
    if 'solid' not in block:
        print title, block
于 2012-10-17T12:41:22.233 に答える
0

正規表現(regex)を使用して、次のパターンを検索し、一致したテキストを改行またはスペースに置き換えることができます。

import re

[...]
output = re.sub(r'entity\n{[\w\s\n"]*solid[\w\s\n"]*\n}\n', '', input)
[...]
于 2012-10-17T08:57:10.387 に答える
0

どうですか:

 re.sub("entity\s*{[^}]*solid\s*}",'',yourString)
于 2012-10-17T09:12:44.233 に答える
0

これが非正規表現の解決策です。もう少し冗長かもしれませんが、より直感的でもあります。

input = open("a.txt", "rb")
output = open("b.txt", "wb") # an empty file for output

def filter_block(instream, outstream, keyword):
    block_buffer = []
    in_block = False
    dump_block = False
    for line in instream:                 # <- Iterate through the lines of the input
        line = line.rstrip()
        block_buffer.append(line)         # <- Keep the block of text in memory

        line_text = line.strip()
        if line_text == "{":
            in_block = True
        elif line_text == keyword and in_block:            # <- Check if this block
            dump_block = True                              #    needs to be dumped
        elif line_text == "}":
            if not dump_block:                             # <- If not, 
                outstream.write("\n".join(block_buffer))   # <- keep it.
                #print "\n".join(block_buffer)

            block_buffer = []                              # <- Flush buffer, continue
            in_block = dump_block = False



filter_block(input, output, "solid")
于 2012-10-17T09:35:03.053 に答える