在Python中,我尝试在与给定模式匹配的任意字符串中找到最后一个位置,该模式指定为负字符集正则表达式模式。例如,使用字符串uiae1iuae200,并且模式不是数字(Python中的正则表达式模式为[^0-9]),结果将需要'8'(在'200'之前的最后一个'e')。
实现这一目标的最有效方法是什么?
由于这是一个有点棘手迅速找到方法的文档,并在Python文档(由于方法的文档是在相应页面的中间位置,喜欢的东西最适合的方法re.search()在重新页),最好的办法我很快发现自己正在使用re.search()-但当前表单必须只是次优的方式:
import re
string = 'uiae1iuae200' # the string to investigate
len(string) - re.search(r'[^0-9]', string[::-1]).start()
Run Code Online (Sandbox Code Playgroud)
我对此不满意,原因有两个:-a)我需要string先将其反转,然后再将其与[::-1]-b)我还需要反转结果位置(将其减去是len(string)因为之前已经反转了字符串)。
即使有的结果,也需要有更好的方法re.search()。
我知道re.search(...).end()over .start(),但是re.search()似乎将结果分成几组,为此,我没有很快找到一种将其应用于最后一个匹配组的简便方法。如果没有指定组,.start(),.end()等,似乎总是与第一集团,其中没有关于最后一场比赛中的位置信息。但是,选择组似乎首先需要将返回值临时保存在变量中(这防止了整齐的直线),因为我需要访问有关选择最后一个组的信息,然后.end()从该组中进行选择。
您对此的pythonic解决方案是什么?我认为拥有pythonic比拥有最优化的运行时更有价值。
更新资料
该解决方案在极端情况下也应起作用,例如123(没有与正则表达式匹配的位置),空字符串等。它不应崩溃,例如由于选择了一个空列表的最后一个索引。但是,因为即使是我在问题中上面的丑陋答案也需要多于一行,所以我想单行可能是不可能的(仅仅是因为需要检查re.search()或re.finditer()在处理返回值之前)。由于这个原因,我将接受针对此答案的pythonic多行解决方案。
用累积执行减少的 Pythonic 方式是什么?
例如,将R的Reduce(). 给定一个列表和一个任意的 lambda 函数,它允许通过设置accumulate=T. 一个简单的乘法作为 lambda 函数的例子是(取自这个答案):
Reduce(`*`, x=list(5,4,3,2), accumulate=TRUE)
# [1] 5 20 60 120
Run Code Online (Sandbox Code Playgroud)
可以使用任意 lambda 函数(如lambda x, y: ...)很重要,因此允许例如仅使用总和、乘法或其他方法的解决方案将无法解决问题。我无法想出一个 Pythonic 解决方案来做到这一点,例如 Python 的itertoolsor functools,但可能有一种方法。尽管还有许多关于使用 Python 减少和专门积累的其他问题和答案,但到目前为止我还没有找到通用的答案。
一个使用循环执行累积归约的非 Pythonic 示例与任意 lambda 函数可能如下所示:
# the source list
l = [0.5, 0.9, 0.8, 0.1, 0.1, 0.9]
# the lambda function for aggregation can be arbitrary
# this one is just made up for the …Run Code Online (Sandbox Code Playgroud)