正则表达式捕获所有导入语句
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)
拆分以获得单独的逗号分隔模块名称。
我想创建一个脚本来查看 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)
拆分以获得单独的逗号分隔模块名称。