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

由于它是单行的,因此这是一种方法:

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返回所有匹配的数组
  • 第一个参数是模式:
    • r''-- 使用原始字符串,不\\做傻事。
    • (?:ELSET|MATERIAL)- 匹配那些关键字,但不记得它们
    • ([^\s,]*)- 匹配一系列非空白、非逗号字符,并记住它们
    • (?:ELSET|MATERIAL)=([^\s,]*)- 匹配文本喜欢ELSET=foo.bar并记住foo.bar

因此,整个事情逐行搜索我们关心的两个模式,并返回这些TYPE=VAL对的值的数组。

于 2013-09-18T15:38:55.220 回答
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
于 2013-09-18T16:01:54.963 回答
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 回答