<p>你可以用</p>
<pre><code>import re
rx = re.compile(r'''
^\ *from\s+
(?P<package_name>[.\w]+)\s+
import\s+
(\()?
(?(2)
(?P<object>[^()]+)\)
|
(?P<object2>(?:.+[\n\r]?)+)
)
''', re.VERBOSE | re.MULTILINE)
def aftermatch(group1, group2):
group = group1 if group1 else group2
objects = [obj.strip() for obj in group.split(',')]
return objects
packages = {m.group('package_name'): aftermatch(m.group('object'), m.group('object2'))
for m in rx.finditer(data)}
print(packages)
</code></pre>
<p/><hr/>
它为字符串<code>imports</code>生成:
<pre><code>{'.sql.base': ['SchemaVisitor'], 'pandas': ['Series'], '_pytest.config': ['main', 'UsageError', 'cmdline', 'hookspec', 'hookimpl'], '.solvers': ['solve', 'solve_linear_system', 'solve_linear_system_LU', 'solve_undetermined_coeffs', 'nsolve', 'solve_linear', 'checksol', 'det_quick', 'inv_quick', 'check_assumptions'], '.ode': ['checkodesol', 'classify_ode', 'dsolve', 'homogeneous_order']}
</code></pre>
<p/><hr/>
有关<a href="https://regex101.com/r/7rRz81/1/" rel="nofollow noreferrer"><strong>regex101.com</strong></a>上的表达式,请参见一个演示,其余部分是一个dict理解,它使用了一个名为<code>aftermatch()</code>的函数来清理对象部分。
<p/><hr/>
<strong>编辑:</strong>对于<em>非粘滞者</em>,可以使用支持分支重置的较新的<a href="https://pypi.python.org/pypi/regex/" rel="nofollow noreferrer"><strong>^{<cd3>} module</strong></a>。在这里,您不再需要函数:
<pre><code>import regex as re
rx = re.compile(r'''
^from\s+
(?P<package_name>[.\w]+)\s+
import\s+
(?|
\((?P<object>[^()]+)\)
|
(?P<object>(?:.+[\n\r]?)+)
)
''', re.VERBOSE | re.MULTILINE)
packages = {m.group('package_name'):
[obj.strip() for obj in m.group('object').split(',')]
for m in rx.finditer(imports)}
print(packages)
</code></pre>