使用Python正则表达式在文件中提取子字符串

2024-05-16 05:55:05 发布

您现在位置:Python中文网/ 问答频道 /正文

一个文件在逻辑定义的字符串块中有n行。我正在解析每一行,并根据一些匹配条件捕获所需的数据。你知道吗

我通读了每一行,找到了代码块:

#python
    for lines in file.readlines():
        if re.match(r'block.+',lines)!= None:
            block_name = re.match(r'block.+', lines).group(0)
            # string matching code to be added here

输入文件:

line1    select KT_TT=$TMTL/$SYSNAME.P1
line2    . $dhe/ISFUNC sprfl tm/tm1032 int 231
line3    select IT_TT=$TMTL/$SYSNAME.P2
line4    . $DHE/ISFUNC ptoic ca/ca256 tli 551
         .....
         .....


line89   CALLING IK02=$TMTL/$SYSNAME.P2
line90   CALLING KK01=$TMTL/$SYSNAME.P1

匹配条件和每个步骤的预期输出:

  1. 读取行时,匹配单词“/ISFUNC”,从最后一个字符中提取字符,直到它匹配“/”并将其保存到变量中。预期o/p->;tm1032 int 231、ca256 tli 551(在第2行和第4行中找到匹配字符串,等等)
  2. 找到ISFUNC后,读取前一行并从该行获取数据,从最后一个字符开始,直到它匹配“/”并将其保存到变量中。应为o/p->;$SYSNAME.P1&;$SYSNAME.P2(第1行和第3行等)
  3. 继续往下读这些行,查找以“CALLING”开头的行,“/”后面的最后一个字符串应与步骤2的o/p($SYSNAME.P1&;SYSNAME.P2)匹配。只需在调用word后捕获数据并保存即可。预期o/p->;KK01(第90行)&IK02(第89行)

最终输出应该是

FUNC             SYS            CALL
tm1032 int 231   $SYSNAME.P1    KK01
ca256 tli 551    $SYSNAME.P2    IK02 

Tags: 字符串blockintlinesp2p1callingsysname
2条回答

如果您只需要最后一个斜杠旁边的文本,那么根本不需要使用regex。你知道吗

只需在每一行上使用.split("/"),就可以得到斜杠旁边的最后一部分

sample = "$dhe/ISFUNC sprfl tm/tm1032 int 231"
sample.split("/")

将导致

['$dhe', 'ISFUNC sprfl tm', 'tm1032 int 231']

然后只需使用-1索引访问列表的最后一个元素即可获得值

PS:找到对应的行后,使用split函数

While reading the lines, match the word "/ISFUNC" and fetch the characters from the last till it matches a "/" and save it to a variable. Expected o/p->tm1032 int 231 (matching string found in line2)

char_list = re.findall(r'/ISFUNC.*/(.*)$', line)
if char_list:
    chars = char_list[0]

Once ISFUNC is found, read the immediate previous line and fetch the data from that line, start form the last character till it matches a "/" and save it to a variable. Expected o/p->$SYSNAME.P1 (line 1)

这里理想的方法是(a)遍历列表索引而不是行本身(即for i in range(len(file.readlines()): ... file.readlines()[i]),或者(b)维护最后一行的副本(例如,将last_line = line放在for循环的)。然后,引用此表达式的最后一行:

data_list = re.findall(r'/([^/]*)$', last_line)
if data_list:
    data = data_list[0]

Continue reading the lines down and look for the line starting with "CALLING" and the last string after "/" should match with o/p of step 2($SYSNAME.P1). Just capture the data after CALLING word and save it. expected o/p -> KK01 (line 90)

假设,从你的例子中,你的意思是“仅仅是数据之后立即(即直到等号):

calling_list = re.findall(r'CALLING(.*)=.*/' + re.escape(data) + '$', line) 
if calling_list:
    calling = calling_list[0]

你可以移动圆括号来改变你想要捕捉的内容。re.findall()将输出一个匹配列表,只包括括号内匹配的位。你知道吗

相关问题 更多 >