извлечение подстроки в файл с использованием Python Regex - PullRequest
0 голосов
/ 10 июня 2019

Файл имеет 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», и последнюю строку после"/" должно совпадать с o / p шага 2 ($ SYSNAME.P1 & $ SYSNAME.P2).Просто запишите данные после слова CALLING и сохраните их.ожидаемый o / p -> KK01 (строка 90) и IK02 (строка 89)

конечный результат должен быть равен

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

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

При чтении строк, сопоставьте слово "/ ISFUNC" и извлеките символы из последних, пока они не совпадут с "/", и сохраните их в переменной.Ожидаемый o / p-> tm1032 int 231 (соответствующая строка найдена в строке 2)

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

Как только ISFUNC найден, прочитайте предыдущую предыдущую строку и извлеките данные из этой строки, запуститесформируйте последний символ, пока он не совпадет с «/», и сохраните его в переменной.Ожидаемый o / p -> $ SYSNAME.P1 (строка 1)

Идеальным подходом здесь является либо (а) итерация по индексам списка, а не по самим строкам (то есть 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]

Продолжайте читать строки вниз и найдите строку, начинающуюся с «CALLING», а последняя строка после «/» должна совпадать с o / p шага 2 ($ SYSNAME.P1). Просто захватитеданные после слова CALLING и сохраните их. ожидаемый o / p -> KK01 (строка 90)

Предполагая, что из вашего примера вы имеете в виду "только данные сразу после (т.е. вплоть до знака равенства):

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

Вы можете переместить скобки, чтобы изменить то, что именно из этой строки вы хотите захватить. re.findall() выведет список совпадений, включая только биты внутрикруглые скобки, которые были сопоставлены.

0 голосов
/ 10 июня 2019

Если все, что вам нужно, это текст рядом с последней косой чертой, вам вообще не нужно использовать регулярные выражения.

Просто используйте .split("/") в каждой строке, и вы можете получить последнюю часть рядом с косой чертой

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

приведет к

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

, а затем просто получить доступ к последнему элементу списка, используя индексирование -1, чтобы получить значение

PS: используйте функцию разделения, когда найдете соответствующую строку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...