【问题标题】:Go to line number and extract text in following matching brackets转到行号并在以下匹配括号中提取文本
【发布时间】:2015-03-11 16:46:15
【问题描述】:

在搜索之前提出的问题后。我需要一些帮助来解决我的问题。我想做的可以是任何语言 Bash、Perl、Python 等。我刚刚开始使用 Bash 和 Perl。

我读了一个文本文件,然后我想编写一个脚本,如果我这样做了

  • 给出行号。
  • 脚本转到该行号并查看第一个括号。
  • 搜索直到找到匹配的括号,同时忽略嵌套括号并输出中间的所有文本。

例如,如果有代码。

INPUT : 我给出行号(例如 60)作为输入

。 . .

//第60行

      //convolving F

        j=0;
        while(j<N_sim)
    {
      Vect_F[j]=0;
      for (k=0; ((k<N_col) & ((j-k)>=0)); k++)
        Vect_F[j]+=F[i][k]*Vect_Up[j-k];
            j++;
    }

      //adding the results to the y matrix

      for (j=0; j < N_sim; j++)
    y[j]+=Vect_F[j];
    }
}

输出

      .     {
  Vect_F[j]=0;
  for (k=0; ((k<N_col) & ((j-k)>=0)); k++)
Vect_F[j]+=F[i][k]*Vect_Up[j-k];
          j++;
      .     }

我应该遵循什么方法?

【问题讨论】:

  • 您能否提供一个文本文件样本和所需的输出?
  • 我认为您需要一个 .net 解决方案,因为它支持平衡组。
  • @stribizhev,使用 Perl 正则表达式可以通过多种方式完成,这还不包括 Text::Balanced。

标签: python regex bash perl text-extraction


【解决方案1】:

使用regex扩展模块检查括号的平衡。

import regex
m = input("Enter the line number:\n")
with open('file') as f:
    fil = f.readlines()[int(m)-1:]
    print(regex.search(r'{(?:(?0)|[^{}])*}', ''.join(fil)).group())

上述代码如何工作的示例。

$ cat file
foo        
while(j<N_sim)
    {
      Vect_F[j]=0;
      for (k=0; ((k<N_col) & ((j-k)>=0)); k++)
        Vect_F[j]+=F[i][k]*Vect_Up[j-k];
            j++;
    }
$ python3 f.py
Enter the line number:
3
{
      Vect_F[j]=0;
      for (k=0; ((k<N_col) & ((j-k)>=0)); k++)
        Vect_F[j]+=F[i][k]*Vect_Up[j-k];
            j++;
    }

【讨论】:

  • 这适用于平衡括号,但仍然会被字符串等中的} 愚弄。为了完美的操作,需要为每种可能的语言编写一个解析器,以及一个可以发现的检测功能该文件中的语言是什么。
  • Python 正则表达式中的(?0) 是什么?看起来像一个表达式,但我在文档中找不到它。
  • @AnttiHaapala:非常正确。更糟糕的是,如果指示的起始行位于多行注释内怎么办?真的,不是那么简单的问题。
  • @rici 如果 op 向我提出此类问题,那么我将删除此答案。或者我会根据他的需要尝试改进我的答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 2013-11-17
  • 2022-07-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
相关资源
最近更新 更多