#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
--------------------------------------------------------------------------------
; ';'
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)))