2

私はPythonスクリプトにかなり慣れていないので、次のタスクの解決策を探しています:

  1. テキストファイルを開く
  2. テキスト ファイル (複数行) 内で検出する必要があるテキスト (名前 + プロパティ) で構成される文字列の配列を作成します。

ファイルの抜粋は次のとおりです。

**HM_comp_by_property "4512_solid"    34
*SOLID SECTION, ELSET=flange2, MATERIAL=WN1.4512
**HM_comp_by_property "4512_2_0mm"     7
*SHELL SECTION, ELSET=ccc_pin , TEMPERATURE =        3, MATERIAL=WN1.4512
2.0       ,         3

最後に作成する必要があるのは、「elset」名とその素材のさまざまな組み合わせで構成される配列です。

flange2    WN1.4512
ccc_pin    WN1.4512

始めるためのヒントを教えていただければ幸いです。私は完全な解決策を期待していません。いくつかのガイドラインがあればいいでしょう:-)。

前もって感謝します!

4

3 に答える 3

1

ワンライナーなので、これを行う1つの方法を次に示します。

with open('input_file.txt') as f:
   array = [x for x in [re.findall(r'(?:ELSET|MATERIAL)=([^\s,]*)', line) for line in f] if x]

本質的に、

  • ファイルを開く
  • 行を 1 つずつ読みます。for line in f
  • 必要なデータを見つけます: re.findall(r'(?:ELSET|MATERIAL)=([^\s,]*)', line)
  • 空白のエントリを取り除きます: [x for x in [...] if x]

re.findall()次の手順に興味があるかもしれません。

  • re.findallすべての一致の配列を返します
  • 最初の引数はパターンです:
    • r''-- 生の文字列を使用して\\ください。ばかげたことはありません。
    • (?:ELSET|MATERIAL)- それらのキーワードに一致するが、それらを覚えていない
    • ([^\s,]*)- 空白やコンマ以外の文字のシーケンスに一致し、それらを記憶する
    • (?:ELSET|MATERIAL)=([^\s,]*)- 好きなテキストを一致ELSET=foo.barさせて覚えるfoo.bar

したがって、全体で、関心のある 2 つのパターンを行ごとに検索し、それらのTYPE=VALペアの値の配列を返します。

于 2013-09-18T15:38:55.220 に答える
0

未テスト。提供された例で動作します。あなたが本当に必要としているのは、ELSET をキーとする辞書だと思います。

import re

def _search_line_for_key_value (key, line):
    key_finder = re.finditer(key + r'\s*=', line)
    try:
        first_match = next(key_finder)
    except StopIteration:
        return None
    value = re.match(r'\s*([^,\s]+)', line[first_match.end():])
    if not value:
        raise ValueError('A line was encountered with an invalid %s value' % key)
    try:
        next(key_finder)
    except StopIteration:
        return value.group(1)
    else:
        raise ValueError('A line was encountered with more than one %s value' % key)

def get_elset_material_dict (filename):
    results = {}
    for line in open(filename):
        elset = _search_line_for_key_value('ELSET', line)
        if elset is not None:
            results[elset] = _search_line_for_key_value('MATERIAL', line)
    return results
于 2013-09-18T16:08:34.823 に答える