我使用lambda函数提取字符串中的数字:
entity: {
type: EntityType, // <-- Duh!
resolve: (person) => getEntityByName(person.name)
}
如何避免两次进行此操作?:
text = "some text with a number: 31"
get_number = lambda info,pattern: re.search('{}\s*(\d)'.format(pattern),info.lower()).group(1) if re.search('{}\s*(\d)'.format(pattern),info.lower()) else None
get_number(text,'number:')
答案 0 :(得分:3)
您可以使用findall()
来代替优雅地处理 。 or
是满足返回条件所需的唯一语句。最后评估None
,如果找到一个空列表则返回(文字的隐含真实性,如列表)。
>>> get_number = lambda info,pattern: re.findall('{}\s*(\d)'.format(pattern),info.lower()) or None
>>> print get_number(text, 'number:')
['3']
>>> print get_number(text, 'Hello World!')
>>>
话虽如此,我建议您使用def
来定义常规的命名函数。您可以将此代码的更复杂部分提取到变量,从而使算法更容易理解。编写长匿名函数可能会导致代码异味。类似于下面的东西:
def get_number(source_text, pattern):
regex = '{}\s*(\d)'.format(pattern)
matches = re.findall(regex, source_text.lower())
return matches or None
答案 1 :(得分:1)
这是非常丑陋的,不会撒谎,但它确实有效,并且如果找到了匹配对象,则会避免返回匹配对象,但如果匹配对象没有,则会返回“无”:
lambda info,pattern: max(re.findall('{}\s*(\d)'.format(pattern),info.lower()),[None],key=lambda x: x != [])[0]