回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个小项目,涉及grepping通过.py文件和挑选导入语句的形式只有<code>from <x> import <y></code>。你知道吗</p>
<p>在构建正则表达式以捕获这一点时,涉及到两种不同的语法,最好通过示例加以说明:</p>
<p>语法#1使用括号,并且可以在括号中包含换行符:</p>
<pre><code>from .sql.base import (
SchemaVisitor
)
import os # ignore this import
from _pytest.config import (
main, UsageError, cmdline,
hookspec, hookimpl
)
</code></pre>
<p>我可以用以下方法捕捉到:</p>
<pre><code>syntax1 = re.compile(r'^ *from (?P<package>[.\w]+) +import +\(?(?P<objects>[*, \n\w]+)\)? *$',
flags=re.MULTILINE)
</code></pre>
<p>语法#2使用行连续体(如果需要),从技术上讲,import语句中没有换行:</p>
<pre><code>from pandas import Series
from .solvers import solve, solve_linear_system, solve_linear_system_LU, \
solve_undetermined_coeffs, nsolve, solve_linear, checksol, \
det_quick, inv_quick, check_assumptions
from .ode import checkodesol, classify_ode, dsolve, \
homogeneous_order
</code></pre>
<p>我可以用以下方法捕捉到:</p>
<pre><code># Only difference: no `\n` in <objects> group
syntax2 = re.compile(r'^ *from (?P<package>[.\w]+) +import +(?P<objects>[*, \w]+) *$',
flags=re.MULTILINE)
</code></pre>
<p>我想把这些压缩成一个语句,能够一次压缩所有命名的组。你知道吗</p>
<p>我在这里需要的是一个<strong>if-then条件,带有一个积极的前瞻性。</strong>类似于:</p>
<pre><code>syntax = re.compile(r'^ *from (?P<package>[.\w]+) +import +(?(?=\([^)]+\))\((?P<obj1>[*, \n\w]+)\) *$|(?P<obj2>[*, \w]+) *$)',
flags=re.MULTILINE)
</code></pre>
<p>这似乎遵循<code>(?ifthen|else)</code>的语法,并对<code>if</code>进行了展望,即</p>
<pre><code>(?(?=regex)then|else)
</code></pre>
<p>其中:</p>
<ul>
<li><code>if</code>是<code>(?=\([^)]+\))</code>:括号中包含一些不是括号的文本</li>
<li><code>then</code>是<code>\((?P<obj1>[*, \n\w]+)\) *$</code></li>
<li><code>else</code>是<code>(?P<obj2>[*, \w]+) *$)</code></li>
</ul>
<p>我这里怎么了?你知道吗</p>
<p><strong>输入:</strong></p>
<pre><code>imports = """
from .sql.base import (
SchemaVisitor
)
from pandas import Series as ser, DataFrame as df
from NumPy import array
import os
import functools
import ctypes # ignore these
from _pytest.config import (
main, UsageError, cmdline,
hookspec, hookimpl
)
from .solvers import solve, solve_linear_system, solve_linear_system_LU, \
solve_undetermined_coeffs, nsolve, solve_linear, checksol, \
det_quick, inv_quick, check_assumptions
from .ode import checkodesol, classify_ode, dsolve, \
homogeneous_order
"""
</code></pre>
<p><strong>期望结果:</strong></p>
<pre><code>syntax.findall(imports)
[('.sql.base', '\n SchemaVisitor\n '),
('pandas', 'Series\n'),
('_pytest.config', '\n main, UsageError, cmdline,\n hookspec, hookimpl\n'),
('.solvers', 'solve, solve_linear_system, solve_linear_system_LU, solve_undetermined_coeffs, nsolve, solve_linear, checksol, det_quick, inv_quick, check_assumptions\n'),
('.ode', 'checkodesol, classify_ode, dsolve, homogeneous_order\n')]
</code></pre>