处理复杂的括号结构以获得预期数据

问题描述 投票:0回答:1

我们将来自 REST API 调用的数据存储在输出文件中,如下所示:

示例输入文件:

test test123 - test (bla bla1 (On chutti))
test test123 bla12 teeee (Rinku Singh)
balle balle (testagain) (Rohit Sharma)
test test123 test1111 test45345 (Surya) (Virat kohli (Lagaan))
testagain blae kaun hai ye banda (Ranbir kapoor (Lagaan), Milkha Singh (On chutti) (Lagaan))

预期输出:内部突出显示

**

test test123 - test (**bla bla1** (On chutti))
test test123 bla12 teeee (**Rinku Singh**)
balle balle (testagain) (**Rohit Sharma**)
test test123 test1111 test45345 (Surya) (**Virat kohli** (Lagaan))
testagain blae kaun hai ye banda (**Ranbir kapoor** (Lagaan), **Milkha Singh** (On chutti) (Lagaan))

得出预期输出的条件:

  • 始终考虑每行中最后出现的括号 ()。我们需要提取最后一对最外面的括号内的值。
  • 在最后一次出现的 () 内,提取出现在每个嵌套括号 () 之前的所有值。
  • 例如:
    test test123 - test (bla bla1 (On chutti))
    最后一个括号从
    (bla
    开始到
    chutti))
    ,所以我需要
    bla bla1
    ,因为它在内部
    (On chutti)
    之前。因此,查找最后一个括号,然后在其中出现多少对括号,我们需要在它们之前获取数据,例如:在
    testagain blae kaun hai ye banda (Ranbir kapoor (Lagaan), Milkha Singh (On chutti) (Lagaan))
    行中需要的是
    Ranbir kapoor
    Milkha Singh

尝试的正则表达式: 我尝试在正则表达式的工作演示上使用以下正则表达式:

正则表达式:

^(?:^[^(]+\([^)]+\) \(([^(]+)\([^)]+\)\))|[^(]+\(([^(]+)\([^)]+\),\s([^\(]+)\([^)]+\)\s\([^\)]+\)\)|(?:(?:.*?)\((.*?)\(.*?\)\))|(?:[^(]+\(([^)]+)\))$

我尝试过的正则表达式工作正常,但我想根据专家的建议即兴创作。

首选语言:主要偏好:Python,次要偏好:awk。寻找改进这个正则表达式或 python,awk 答案也可以。我自己也会尝试添加一个

awk
答案。

python regex awk
1个回答
0
投票

首先,以下是我如何使用任何 awk 找到每行最后一个

(...)

$ cat tst.awk
{
    rec = $0
    beg = 0
    while ( match(rec, /\([^()]*)/) ) {
        beg  = RSTART
        lgth = RLENGTH
        rec  = substr(rec,1,RSTART-1) RS substr(rec,RSTART+1,RLENGTH-2) RS substr(rec,RSTART+RLENGTH)
    }
}
beg {
    print substr($0,beg,lgth)
}

$ awk -f tst.awk file
(bla bla1 (On chutti))
(Rinku Singh)
(Rohit Sharma)
(Virat kohli (Lagaan))
(Ranbir kapoor (Lagaan), Milkha Singh (On chutti) (Lagaan))

从那里开始,只需找到那些本身没有包含在

(...)
中的字符串中的子字符串,将
**
放在它们周围,然后在
substr($0,1,beg-1)
之后打印它们。我可能会稍后添加那段代码,现在就运行。

© www.soinside.com 2019 - 2024. All rights reserved.