在边界内抓取单词 [英] Grabbing words within boundaries
问题描述
问题:表达用于在两个边界之间抓取单词的正则表达式.下面的代码不起作用
Problem : Expressing the regexp for grabbing words between two boundaries. Below code is not working
regexp -- {/b/{(.+)/}}/b} $outputline8 - filtered
目标:
- 获取所有引脚名称
xxx/xxx[x]
位于set_false_path
以及{
和}
之间. - set_false_path 中可能还有另一个选项,例如-through",我仍然想在这些选项之后抓取这些引脚并将这些引脚放入输出文件中,如下所述.
- Grabbing all pin name
xxx/xxx[x]
which is located after theset_false_path
and between{
and}
. - 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屋!