创建一个字符串数组,其中包含使用python在文件中找到的文本组合

时间:2013-09-18 15:20:54

标签: python arrays string

我是python脚本的新手,我正在为以下任务寻找解决方案:

  1. 打开文本文件
  2. 创建一个字符串数组,其中包含必须在文本文件中找到的文本(名称+属性)(多行)
  3. 该文件的摘录可以在下面找到:

    **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
    

    希望你能为我提供一些帮助我入门的建议。我不希望有一个完整的解决方案,一些指导方针会很好: - )。

    提前致谢!

3 个答案:

答案 0 :(得分: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]

实质上,

  • 打开文件
  • 一次阅读一行:for line in f
  • 找到您需要的数据:     re.findall(r'(?:ELSET|MATERIAL)=([^\s,]*)', line)
  • 删除空白条目:     [x for x in [...] if x]

您可能对re.findall()步骤感兴趣:

  • re.findall返回所有匹配项的数组
  • 第一个arg是模式:
    • r'' - 使用原始字符串,没有\\ tomfoolery。
    • (?:ELSET|MATERIAL) - 匹配这些关键字,但不记得它们
    • ([^\s,]*) - 匹配一系列非空格,非逗号字符,并记住它们
    • (?:ELSET|MATERIAL)=([^\s,]*) - 匹配ELSET=foo.bar等文字并记住foo.bar

所以,整个事情是逐行搜索我们关心的两种模式,并返回那些TYPE=VAL对的值数组。

答案 1 :(得分:0)

import re   

fp = open("input.txt")

ans = {}     // Dictionary to store the values
for line in fp:
    if re.match("\*[^\*]", line):    // If the line starts with only one *
        elset = re.findall(".*ELSET=([^\s,]*)", line)[0]
        material = re.findall(".*MATERIAL=([^\s,]*)", line)[0]

        ans[elset] = material

print ans

答案 2 :(得分: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