正则表达式捕获所有导入语句

Regex to capture all import statements

我想创建一个脚本来查看 Python 文件并找到所有 import 语句。这些可能的变化如下:

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

通过查看这些,可以认为逻辑应该是:

from <foo> 语句中获取所有 <foo> 以及 import <bar> 中没有以 from <foo> 开头的 <bar>

为了用正则表达式翻译上面的内容,我写道:

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

问题似乎出在负向回顾的非固定宽度上,但我似乎无法修复它。

编辑:

作为奖励,捕获多个包含也很好,如:

import sys, glob

您似乎只想从一行的开头提取匹配项,同时考虑到前导空格。

您可以考虑使用

^\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+ 个单词字符。

在 Python 中,您稍后可以将第 1 组值与 re.split(r'\s*,\s*', group_1_value) 拆分以获得单独的逗号分隔模块名称。