Regex для захвата всех операторов импорта

Я хочу создать скрипт, который смотрит в файл Python и находит все import заявления. Возможны следующие варианты:

import os
import numpy as np
from itertools import accumulate
from collections import Counter as C
from pandas import *

Глядя на это, можно утверждать, что логика должна быть:

Достань мне все <foo> от from <foo> заявления и те <bar> от import <bar> которым не предшествует from <foo> ,

Чтобы перевести вышесказанное в регулярные выражения, я написал:

from (\w+)|(?<!from \w+)import (\w+)

Кажется, проблема в нефиксированной ширине негативного вида сзади, но я не могу исправить ее.

РЕДАКТИРОВАТЬ:

В качестве бонуса также было бы неплохо собрать несколько включений, как в:

import sys, glob

1 ответ

Решение

Кажется, вы хотите извлечь только совпадения из начала строки, принимая во внимание начальные пробелы.

Вы можете рассмотреть возможность использования

^\s*(?:from|import)\s+(\w+(?:\s*,\s*\w+)*)

Смотрите демо регулярных выражений.

подробности

  • ^ - начало строки (используйте re.M также соответствовать началу строки)
  • \s* - 0+ пробелов (используйте [^\S\r\n]* соответствовать только горизонтальным пробелам)
  • (?:from|import) - любое из двух слов
  • \s+ - 1+ пробелов
  • (\w+(?:\s*,\s*\w+)*) - 1 или более символов слова с последующим 0+ появлением 0+ пробелов, ,, 0+ пробелов, а затем 1+ слов символов.

В Python вы можете позже разделить значение группы 1 с помощью re.split(r'\s*,\s*', group_1_value) чтобы получить отдельные имена модулей через запятую.

Другие вопросы по тегам