Получите список имен структур, которые находятся за пределами необязательных строк «пакет» и «конечный пакет»

#python #python-3.x #regex #python-2.7 #re

Вопрос:

Я пытаюсь получить имена структур, которые являются внешними package и endpackage необязательными строками. Если package строк и нет endpackage , то скрипт должен вернуть все имена структур.

Это мой сценарий:

 import re

a = """
package new;

typedef struct packed
{
    logic a;
    logic b;
} abc_y;

typedef struct packed
{
    logic a;
    logic b;
} abc_t;

endpackage

typedef struct packed
{
    logic a;
    logic b;
} abc_x;

"""

print(re.findall(r'(?!package)*.*?typedefs structs packeds*{.*?}s*(w );.*?(?!endpackage)*', a, re.MULTILINE|re.DOTALL))
 

Это и есть результат:

 ['abc_y', 'abc_t', 'abc_x']
 

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

 ['abc_x']
 

Я что-то упускаю в регулярном выражении, но не могу понять, что именно. Может кто-нибудь, пожалуйста, помочь мне исправить это? Заранее спасибо.

Ответ №1:

Воспользуйся

 bpackage.*?bendpackageb|typedefs structs packeds*{[^{}]*}s*(w );
 

См.Доказательство регулярного выражения.

объяснение

 --------------------------------------------------------------------------------
  b                       the boundary between a word char (w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  package                  'package'
--------------------------------------------------------------------------------
  .*?                      any character except n (0 or more times
                           (matching the least amount possible))
--------------------------------------------------------------------------------
  b                       the boundary between a word char (w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  endpackage               'endpackage'
--------------------------------------------------------------------------------
  b                       the boundary between a word char (w) and
                           something that is not a word char
--------------------------------------------------------------------------------
 |                        OR
--------------------------------------------------------------------------------
  typedef                  'typedef'
--------------------------------------------------------------------------------
  s                       whitespace (n, r, t, f, and " ") (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  struct                   'struct'
--------------------------------------------------------------------------------
  s                       whitespace (n, r, t, f, and " ") (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  packed                   'packed'
--------------------------------------------------------------------------------
  s*                      whitespace (n, r, t, f, and " ") (0 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  {                        '{'
--------------------------------------------------------------------------------
  [^{}]*                   any character except: '{', '}' (0 or more
                           times (matching the most amount possible))
--------------------------------------------------------------------------------
  }                        '}'
--------------------------------------------------------------------------------
  s*                      whitespace (n, r, t, f, and " ") (0 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  (                        group and capture to 1:
--------------------------------------------------------------------------------
    w                       word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of 1
--------------------------------------------------------------------------------
  ;                        ';'
 

Код на Python:

 print(list(filter(None,re.findall(r'bpackage.*?bendpackageb|typedefs structs packeds*{[^{}]*}s*(w );', a, re.DOTALL))))
 

Результаты: ['abc_x']

Комментарии:

1. @ Ryszard Чешский, я попробовал регулярное выражение, которое вы предоставили, но я получаю вывод в виде: ['', 'abc_x']

2. @Милая list(filter(None,re.findall(r'bpackage.*?bendpackageb|typedefs structs packeds*{[^{}]*}s*(w );', a, re.DOTALL)))