регулярное выражение для поиска текста с последующим пробелом или ( - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь извлечь несколько слов (как показано в ожидаемом выводе) из следующего файла sample.log.Я сталкиваюсь с трудностями при извлечении последнего ожидаемого результата (то есть, xuvs).Код может извлечь все выходные данные, кроме последнего. Я пытаюсь найти, как кодировать регулярное выражение, чтобы подразумевать «найти текст с пробелом или (». Любые указатели на другие подходы очень ценятся.

пример.log

  for (i=0; i< models; i = i+1) begin:modelgen

 model_ip model_inst
     (
      .model_powerdown(model_powerdown),
      .mcg(model_powerdown),
      .lambda(_lambda[i])
      );
  assign fnl_verifier_lock = (tx_ready & rx_ready) ? &verifier_lock :1'b0;

native_my_ip native_my_inst
 (
  .tx_analogreset(tx_analogreset),
 //.unused_tx_parallel_data({1536{1'b0}})

  );

// END Section I

resync
 #(
   .INIT_VALUE (1)
   ) inst_reset_sync
   (
.clk    (tx_coreclkin),
.reset  (!tx_ready), // tx_digitalreset from reset
.d      (1'b0),
.q      (srst_tx_common  )
);

har HA2  (fs, ha, lf, c);                  

#need to extract xuvs
xuvs or1(fcarry_out, half_carry_2, half_carry_1);

ожидаемый результат

model_ip
native_my_ip
resync
har
xuvs

code.py

import re

input_file = open("sample.log", "r")
lines = input_file.read()   # reads all lines and store into a variable
input_file.close()
for m in re.finditer(r'^\s*([a-zA-Z_0-9]+)\s+([a-zA-Z_0-9]+\s+\(|#\()',   lines, re.MULTILINE):
   print m.group(1)

1 Ответ

0 голосов
/ 04 февраля 2019

Вам необходимо сопоставить любые дополнительные пробельные символы до (:

^\s*(\w+)\s+(\w+|#)\s*\(
                   ^^^

См. Демонстрационную версию regex .[a-zA-Z0-9_] можно сократить до \w (если вам нужно использовать его в Python 3 и сопоставлять только буквы и цифры ASCII, скомпилируйте с флагом re.ASCII).

Подробности

  • ^ - начало строки (поскольку используется re.MULTILINE)
  • \s* - 0+ пробелов
  • (\w+) - группа 1: одна или несколько букв, цифр или _
  • \s+ - 1+ пробелы
  • (\w+|#) - Группа 2: одна или несколько букв, цифр или _ или a #
  • \s* - 0+ пробелов
  • \( - ( char.

Python demo :

for m in re.finditer(r'^\s*(\w+)\s+(\w+|#)\s*\(',   lines, re.MULTILINE):
    print m.group(1)

Выход:

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