<p>您可以使用<code>re.finditer</code>来提取所有匹配项的起始位置,并从列表中返回最后一个。试试下面的Python代码:</p>
<pre><code>import re
print([m.start(0) for m in re.finditer(r'\D', 'uiae1iuae200')][-1])
</code></pre>
<p>印刷品:</p>
^{pr2}$
<p><strong>编辑:</strong>
为了使解决方案更加优雅,以便在所有类型的输入中都能正常工作,下面是更新的代码。现在解决方案分为两行,因为必须执行检查如果list为空,那么它将打印-1,否则将打印索引值:</p>
<pre><code>import re
arr = ['', '123', 'uiae1iuae200', 'uiae1iuae200aaaaaaaa']
for s in arr:
lst = [m.start() for m in re.finditer(r'\D', s)]
print(s, ' >', lst[-1] if len(lst) > 0 else None)
</code></pre>
<p>打印以下内容,如果没有找到这样的索引,则打印<code>None</code>而不是索引:</p>
<pre><code> > None
123 > None
uiae1iuae200 > 8
uiae1iuae200aaaaaaaa > 19
</code></pre>
<p><strong>编辑2:</strong>
正如OP在他的帖子中所说,<code>\d</code>只是我们开始的一个例子,因此我想出了一个解决方案来处理任何通用的regex。但是,如果这个问题真的只能用<code>\d</code>来解决,那么我可以给出一个更好的解决方案,它根本不需要列表理解,而且可以通过使用更好的regex来查找最后一个出现的非数字字符并打印其位置来轻松编写。我们可以使用<code>.*(\D)</code>regex查找最后出现的非数字,并使用以下Python代码轻松打印其索引:</p>
<pre><code>import re
arr = ['', '123', 'uiae1iuae200', 'uiae1iuae200aaaaaaaa']
for s in arr:
m = re.match(r'.*(\D)', s)
print(s, ' >', m.start(1) if m else None)
</code></pre>
<p>如果找不到任何非数字字符和<code>None</code>的字符串及其相应索引:</p>
<pre><code> > None
123 > None
uiae1iuae200 > 8
uiae1iuae200aaaaaaaa > 19
</code></pre>
<p>正如您所看到的,这段代码不需要使用任何列表理解,而且更好,因为它只需通过一个regex调用<code>match</code>来查找索引。在</p>
<p>但如果OP确实意味着要使用任何通用regex模式编写它,那么需要使用comprehension编写上面的代码。我甚至可以把它写成一个函数,它可以把正则表达式(比如<code>\d</code>或者甚至是复杂的)作为参数,并动态地生成一个传递的正则表达式的负数并在代码中使用它。如果真的需要,请告诉我。在</p>