在边界内抓取单词 [英] Grabbing words within boundaries

查看:25
本文介绍了在边界内抓取单词的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题:表达用于在两个边界之间抓取单词的正则表达式.下面的代码不起作用

Problem : Expressing the regexp for grabbing words between two boundaries. Below code is not working

regexp -- {/b/{(.+)/}}/b} $outputline8 - filtered

目标:

  1. 获取所有引脚名称 xxx/xxx[x] 位于set_false_path 以及 {} 之间.
  2. set_false_path 中可能还有另一个选项,例如-through",我仍然想在这些选项之后抓取这些引脚并将这些引脚放入输出文件中,如下所述.
  1. Grabbing all pin name xxx/xxx[x] which is located after the set_false_path and between { and }.
  2. There might be another option such as "-through" in the set_false_path and I still want to grab those pins after those options and put those pins into the output file just as described below.

这是我的输入文件:input_file.txt

set_false_path -from [get_ports {AAAcc/BBB/CCC[1] \
BBB_1/CCC[1] CCC/DDD[1] \
DDD/EEE EEE/FFF[1] \
FFF/GGG[1]}] -through\
[get_pins {GGG/HHH[1] HHH/III[1] \
XXX/YYY[1] YYY/XXX[1] \
AAA/ZZZ[1]}]
set_timing_derate -cell_sdada [get_cells \
{NONO[1]}
set_false_path -from [get_ports {AAA/DDD[2]}]

这是输出文件(我期望的格式):output_file.txt

Here is the output file (The format I expected): output_file.txt

AAAcc/BBB/CCC[1]
BBB_1/CCC[1]
CCC/DDD[1]
DDD/EEE
EEE/FFF[1]
FFF/GGG[1]
GGG/HHH[1]
HHH/III[1]
XXX/YYY[1]
YYY/XXX[1]
AAA/ZZZ[1]
AAA/DDD[2]

一般来说,这些引脚没有任何通用模式.所以唯一的方法是获取 {} 之间的所有引脚.

Generally speaking, those pins don't have any general pattern. So the only way is to grab all pins between { and }.

从上面的输入文件中,我们可以看到那些 set_ 命令(来自 input.txt)没有连接在一个句子中.所以我做了一个代码,它只会抓取 set_false path 中的内容并加入这些行,下面是我的代码:

From above input file, we can see that those set_ commands (from the input.txt) is not connected in a single sentence. So I made a code that will only grab the content within set_false path and join those lines, below is my code:

set inputfile [open "input_file.txt" r]
set outputfile [open "output_file.txt" w]

set first_word ""
set outputline1 ""
set filtered ""

while { [gets $inputfile line] != 1} {
 set first_word [lindex [split $line ""] 0]
 set re2 {^set_+?}
 #match any "set_ " command
 if { [regexp $re2 $first_word matched] } {
  #if the "set_ " command is found and the outputline1 is not empty, then it's 
  # the end of the last set_ command
  if {$outputline1 != ""} {
   #do the splitting here and put into the outputfile later on
   regexp -- {/b/{(.+)/}}/b} $outputline8 - filtered
   puts "$filtered:$filtered"
   set outputline1 ""
  }

  # grab content if part of set_false_path
  if{ [regexp "set_false_path" $first_word] } {
   # if it's the expected command set, put "command_set" flag on which will be used on 
   # the next elseif
   set command_set 1
   lappend outputline1 $line
   regsub -all {\\\[} $outputline1 "\[" outputline2
   regsub -all {\\\]} $outputline2 "\]" outputline3
   regsub -all {\\\{} $outputline3 "\{" outputline4
   regsub -all {\\\}} $outputline4 "\}" outputline5
   regsub -all {\\\\} $outputline5 "\\" outputline6
   regsub -all {\\ +} $outputline6 " " outputline7
   regsub -all {\s+} $outputline7 " " outputline8
  } else {
   set command_set 0
   # if the line isn't started with set_false_path but it's part of set_false_path command
  } elseif {$command_set} {
   lappend outputline1 $line
   regsub -all {\\\[} $outputline1 "\[" outputline2
   regsub -all {\\\]} $outputline2 "\]" outputline3
   regsub -all {\\\{} $outputline3 "\{" outputline4
   regsub -all {\\\}} $outputline4 "\}" outputline5
   regsub -all {\\\\} $outputline5 "\\" outputline6
   regsub -all {\\ +} $outputline6 " " outputline7
   regsub -all {\s+} $outputline7 " " outputline8
  } else {
  }
 }
}

puts "outputline:outputline8"
#do the splitting here and put into the file later on for the last grabbed line!

close $inputfile
close $outputfile

代码深入讨论:

  • 我注意到在我重叠线到outputline1后,我会得到带有多个空格和正斜杠的意外输出:set_false_path\ -from\ \[get_ports\ \{AAA/BBB\[1\] \ ... 等等..

  • I notice that after I lapped the line to outputline1, I will get unexpected output with multiple spaces and forward slash: set_false_path\ -from\ \[get_ports\ \{AAA/BBB\[1\] \ ... etc..

此输出包含每个特殊字符的退格符 (\),例如 {[ 、空格等.所以我把许多 regsub 删除所有这些不必要的添加.而最终的join结果位于$outputline8

This output contains of backspaces (\) for every special character such as { , [ , space, etc. So that I put many regsub to remove all of these unnecessary addition. And the final joined result is located in $outputline8

$outputline8 的结果:

The result of $outputline8 :

set_false_path -from [get_ports {AAAcc/BBB/CCC[1] BBB_1/CCC[1] CCC/DDD[1] DDD/EEE EEE/FFF[1] FFF/GGG[1]}] -through [get_pins {GGG/HHH[1] HHH/III[1] XXX/YYY[1] YYY/XXX[1] AAA/ZZZ[1]}]
set_false_path -from [get_ports {AAA/DDD[2]}]

  • 我打算在 {}

    参考:处理多行文本文件进行打印单行

    • 最后一次更新开始:

    如果输入文件:

    set_false_path -from [get_ports {AAAcc/BBB/CCC[1] BBB_1/CCC[1] DDD/EEE}] -through [get_pins {XXX_1[1]}]
    

    我想要输出文件:

    AAAcc/BBB/CCC[1]
    BBB_1/CCC[1]
    DDD/EEE
    XXX_1[1]
    

  • 谢谢!这是最后一次更新:

    注意:我是 TCL 和这个论坛的新手,非常感谢任何建议!

    NB: I am new to TCL and this forum and any advice is really appreciated!

    推荐答案

    试试下面的脚本.我在代码注释中添加了解释:

    Try the following script. I have added explanations in the code comments:

    set inputfile [open "input_file.txt" r]
    set outputfile [open "output_file.txt" w]
    
    # This is a temp variable to store the partial lines
    set buffer ""
    
    while { [gets $inputfile line] != -1} {
      # Take previous line and add to current line
      set buffer "$buffer[regsub -- {\\[[:blank:]]*$} $line ""]"
    
      # If there is no ending \ then stop adding and process the elements to extract
      if {![regexp -- {\\[[:blank:]]*$} $line]} {
        # Skip line if not "set_false_path"
        if {[lindex [split $buffer " "] 0] ne "set_false_path"} {
          set buffer ""
          continue
        }
    
        # Grab each element with regexp into a list and print each to outputfile
        # m contains whole match, groups contains sub-matches
        foreach {m groups} [regexp -all -inline -- {\{([^\}]+)\}} $buffer] {
          foreach out [split $groups] {
            puts $outputfile $out
          }
        }
    
        # Clear the temp variable
        set buffer ""
      }
    }
    
    close $inputfile
    close $outputfile
    

    这篇关于在边界内抓取单词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆