我是python脚本的新手,我正在为以下任务寻找解决方案:
该文件的摘录可以在下面找到:
**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
希望你能为我提供一些帮助我入门的建议。我不希望有一个完整的解决方案,一些指导方针会很好: - )。
提前致谢!
答案 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
返回所有匹配项的数组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