как создать отрицательное выражение за кадром, которое - добавлено - не должно быть пустым словом - PullRequest
0 голосов
/ 18 октября 2018

Я хочу найти элементы, соответствующие пространствам имен / контекстам классов в C ++, которые не являются std или глобальной областью

Я использую это:

>>> re.findall("(?<!std)::(\w+)","my_namespace::my_function std::vector ::open i=0;::open")
['my_function', 'open', 'open']

, поэтому vectorотфильтровывается, как я и ожидал, но извлекается также глобальная область open (мне нужно непустое слово перед ::, которое не std, а ; не соответствует)

Я знаю, что могу извлечь пространство имен, а также имя и пост-процесс следующим образом:

>>> [b for a,b in re.findall("(\w+)::(\w+)","my_namespace::my_function std::vector ::open i=0;::open") if a != 'std']
['my_function']

но есть ли способ регулярного выражения сделать это?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете использовать решение для регулярных выражений, например

re.findall(r'\b(?!std::)\w+::(\w+)', s)

См. Демонстрационную версию регулярных выражений

Подробности

  • \b - граница слова
  • (?!std::) - нет std:: допускается непосредственно справа от текущего местоположения
  • \w+:: - 1+ слов символов и ::
  • (\w+) - Группа захвата 1 (фактический вывод re.findall): 1+ слов символов.
0 голосов
/ 18 октября 2018

Вы можете добавить еще одно утверждение за заявлением:

>>> re.findall(r"(?<!std)(?<=\w)::(\w+)", "my_namespace::my_function std::vector ::open")
['my_function']
  • (?<=\w) проверяет, предшествует ли :: символ слова
...