【问题标题】:Python: find pattern and replace word by referring to another linePython:通过引用另一行查找模式并替换单词
【发布时间】:2017-09-06 07:20:44
【问题描述】:
"E1 Sys1 (PTAC) (G.WNW2)" = SYSTEM          
   TYPE             = PTAC
   HEAT-SOURCE      = HEAT-PUMP
   BASEBOARD-SOURCE = NONE
   SIZING-RATIO     = 1.15
   MAX-SUPPLY-T     = 90
   MIN-SUPPLY-T     = 55
   FAN-SCHEDULE     = "S1 Sys1 (PTAC) Fan Sch"
   FAN-CONTROL      = TWO-SPEED
   SUPPLY-STATIC    = 0.5
   SUPPLY-EFF       = 0.33
   COOLING-EIR      = 0.329152
   HEATING-EIR      = 0.34025
   ..
"E1 WNW Perim Zn (G.WNW2)" = ZONE            
   TYPE             = CONDITIONED
   MIN-FLOW-RATIO   = 1
   FLOW/AREA        = 0.5
   OA-FLOW/PER      = 34.6035
   DESIGN-HEAT-T    = 72
   HEAT-TEMP-SCH    = "S1 Sys1 (PTAC) Heat Sch"
   DESIGN-COOL-T    = 75
   COOL-TEMP-SCH    = "S1 Sys1 (PTAC) Cool Sch"
   SIZING-OPTION    = ADJUST-LOADS
   SPACE            = "Unit 100"
   ..

我有这个用于建筑能源建模的文本文件。

系统 (E1 Sys1 (PTAC) (G.WNW2)) 和区域 (E1 WNW Perim Zn (G.WNW2)) 是一对。

我想通过引用空间名称并添加缩写(例如_sys,_zn)来替换系统名称和区域名称,以使其易于理解。

空间名称将位于区域部分的底部。

你能帮我把上面的替换成下面的吗?

"Unit 100_sys" = SYSTEM          
   TYPE             = PTAC
   HEAT-SOURCE      = HEAT-PUMP
   BASEBOARD-SOURCE = NONE
   SIZING-RATIO     = 1.15
   MAX-SUPPLY-T     = 90
   MIN-SUPPLY-T     = 55
   FAN-SCHEDULE     = "S1 Sys1 (PTAC) Fan Sch"
   FAN-CONTROL      = TWO-SPEED
   SUPPLY-STATIC    = 0.5
   SUPPLY-EFF       = 0.33
   COOLING-EIR      = 0.329152
   HEATING-EIR      = 0.34025
   ..
"Unit 100_zn" = ZONE            
   TYPE             = CONDITIONED
   MIN-FLOW-RATIO   = 1
   FLOW/AREA        = 0.5
   OA-FLOW/PER      = 34.6035
   DESIGN-HEAT-T    = 72
   HEAT-TEMP-SCH    = "S1 Sys1 (PTAC) Heat Sch"
   DESIGN-COOL-T    = 75
   COOL-TEMP-SCH    = "S1 Sys1 (PTAC) Cool Sch"
   SIZING-OPTION    = ADJUST-LOADS
   SPACE            = "Unit 100"
   ..

【问题讨论】:

    标签: python python-3.x replace find refer


    【解决方案1】:

    您可以尝试以下方式:

    file = open(file_name, "r")
    infile = file.readlines()
    return_string = ""
    
    for i in range(len(infile)):
        infile[i] = infile[i].split()  #split into the equation parts
        if infile[i][0] == "SPACE": #found space element
            space = ' '.join(infile[i][2:])  #take the name which is the third element and after
    for i in range(len(infile)):
        if infile[i][2] == "ZONE":
            infile[i][0] = space + "_zn"
        elif infile[i][2] == "SYSTEM":
            infile[i][0] = space + "_sys"
        return_string += (" ".join(infile[i]) + "\n") #recreating the file
    
    print (return_string)
    

    此代码假定它将运行到 SPACE = xxx 的行,否则它将崩溃。希望这会有所帮助

    【讨论】:

    • 感谢您的回答。如果空间名称包含空格,它不起作用,但它可以帮助我解决问题。我正在根据您的方法进行工作。谢谢。
    • 我已经更改了该部分以说明带有空格的空间名称,我认为它现在应该适用于这种情况:)
    【解决方案2】:

    使用具有复杂 regex 模式的 regex.sub() 函数的简短解决方案:

    import re
    
    with open('yourfile.txt', 'r') as f:
        pat = re.compile('"[^"]+"( = SYSTEM[\s\S]+)"[^"]+"( = ZONE[\s\S]+)(SPACE\s*= )"([^"]+)"')
        content = pat.sub('"\\4_sys"\\1"\\4_zn"\\2\\3"\\4"', f.read(), re.M)
        print(content)
    
    • \\1\\2\\3\\4 - 分别指向第1、2、3、4个捕获组(捕获组为括号内的序列(...)

    输出:

    "Unit 100_sys" = SYSTEM          
       TYPE             = PTAC
       HEAT-SOURCE      = HEAT-PUMP
       BASEBOARD-SOURCE = NONE
       SIZING-RATIO     = 1.15
       MAX-SUPPLY-T     = 90
       MIN-SUPPLY-T     = 55
       FAN-SCHEDULE     = "S1 Sys1 (PTAC) Fan Sch"
       FAN-CONTROL      = TWO-SPEED
       SUPPLY-STATIC    = 0.5
       SUPPLY-EFF       = 0.33
       COOLING-EIR      = 0.329152
       HEATING-EIR      = 0.34025
       ..
    "Unit 100_zn" = ZONE            
       TYPE             = CONDITIONED
       MIN-FLOW-RATIO   = 1
       FLOW/AREA        = 0.5
       OA-FLOW/PER      = 34.6035
       DESIGN-HEAT-T    = 72
       HEAT-TEMP-SCH    = "S1 Sys1 (PTAC) Heat Sch"
       DESIGN-COOL-T    = 75
       COOL-TEMP-SCH    = "S1 Sys1 (PTAC) Cool Sch"
       SIZING-OPTION    = ADJUST-LOADS
       SPACE            = "Unit 100"
       ..
    

    【讨论】:

    • 感谢您的评论。您能否详细说明如何使用 \\1, \\2, \\3, \\4 ?您认为这种方法适用于 100 对区域吗?谢谢!
    • @Openyoureyes,查看我关于捕获组的解释说明
    【解决方案3】:

    我根据@chngzm 提供的方法解决了这个问题。我分享我的代码。这不是一个花哨的代码,但它可以工作:)

    首先,我列出了 SPACE 名称。我使用了tryexcept 函数,因为文本文件包含一些空行。

    file = open("targetfile.txt", "r")  #Read target file
    infile = file.readlines()
    return_string = ""
    
    # Making list of SPACE names
    space = []
    for i in range(len(infile)):
        infile[i] = infile[i].split()  #split into the equation parts
        try:
            if infile[i][0] == "SPACE": #found space element
                space.append(" ".join(map(str,infile[i][2:]))) #take the name which is the third element and after
        except:
            continue
    space = [x.strip('"') for x in space] #take off quotation marks
    

    然后,根据上述列表中的 SPACE 名称更改每个 SYSTEM 和 ZONE 名称。

    for i in range(len(infile)):
        try:
            if infile[i][-1] == "SYSTEM":
                del infile[i][:-2] 
                infile[i].insert(0,"\""+space[0] + "_sys"+"\"")
            elif infile[i][-1] == "ZONE":
                del infile[i][:-2] 
                infile[i].insert(0,"\""+space[0] + "_zn"+"\"")
                del space[0] #remove used SPACE name
            return_string += (" ".join(infile[i]) + "\n") #recreating the file
        except:
            continue
    print (return_string)
    

    这段代码给出了我真正想要的。如果您让我知道任何更好/花哨的方法,我将不胜感激。再次感谢! @chngzm

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 2013-10-22
      • 2021-05-22
      • 2017-01-22
      相关资源
      最近更新 更多