0

我正在尝试将 bash 脚本完全移植到 python。我这样做是为了尝试进入 python。

bash 脚本的一部分根据 regex 处理捕获部分。

这就是我在 bash 脚本中的做法:

搜索正则表达式 [multiline] 例如:m/^[^\S\n]*\([\w0-9,*\s]*\)\s*\{[^\S\n]*\}/gm//不是实际的正则表达式!

获取上述正则表达式的起始行号

用于awk在 while 循环中从行号开始读取。扫描每一行以查找方法 start 即[。如果找到增量计数变量,[否则如果]遇到 a 则减少计数器。如果计数器 == 0,则打印NR并退出循环。这给了我部分结束线编号。

我再一次awk把这个部分分开了。 nawk -v start=$var -v end=$var2 'NR >=start && NR <=end' file.sci

要处理的示例文件:

!!--Blah
!!
!!
method1 {fn->23}[          --line 12
     if [ ] ;else[]
 ]                         --line 14
method2 {fn->23,f2->65}[
     if [ ] ;else[i=0]
[[[[]]]] 
 ]

bashcript 所做的是它给了我方法 1 开始说第 12 行,然后这个开始是给 awk 函数,它逐行读取并保持计数器打开[]最后给方法 1 的第 14 行。然后使用该行我将方法剥离到另一个文件中。

我已经完成了正则表达式部分,但我不知道行号的方法在 python 中是否可行。我确信存在比提到的更好的算法。如果有人可以指导我正确的方向或提供示例代码或指针,我将不胜感激。

4

1 回答 1

1

这就是我在 Python 中的做法:

import re # to be able to use regular expressions
count = 0
found_one_at_least = False
result = ""
with open("read_file", "r") as f:
    for line in f:
        if re.search(regexp, line) is not None: # single line re to know when to start recording; returns None if there is no match, help(re.search) will tell you
            break # stop this loop and go on to the actual recording
    for line in f: # this will continue reading from where the last loop stopped, because it is an f is an iterator
        # to make it not do that you can use f.seek(0), but we do not need that
        result += line # append the line to the result
        count += line.count("[")-line.count("]") # compute the number of open/close brackets
        if count >= 1: # this is just so it does not stop at the first line if there is no [ in it
            found_one_at_least = True
        if count == 0 and found_one_at_least:
            break # stop recording when we are back at the "root" level
with open("write_file", "w") as f: # open the file, and let python handle closing and cleaning up...
    f.write(result) # write the result

我并没有真正看到正则表达式的意义,因为它似乎与您样本的任何行都不匹配,但无论如何,您可以使用您喜欢的任何正则表达式,但请记住您是在一行基础上工作的,所以只有单行。

此外,由于您将使用相同的正则表达式,您可能希望这样做:

regexp = re.compile(regexp_string)
# ...
if regexp.search(string) is not None:
# ...

它可能会给您带来小的性能提升。

于 2012-10-15T16:59:04.027 回答