Regex для захвата всех операторов импорта - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу создать скрипт, который просматривает файл 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 Ответ

0 голосов
/ 05 декабря 2018

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

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

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

См. regex demo .

Подробности

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

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

...