所以基本上我在这里要做的是询问用户输入随机字符串,例如:
asdf34fh2
我想将这些数字从列表中拉出来并获得[3,4,2]
,但我会继续[34, 2]
。
import re
def digit_product():
str1 = input("Enter a string with numbers: ")
if str1.isalpha():
print('Not a string with numbers')
str1 = input("Enter a string with numbers: ")
else:
print(re.findall(r'\d+', str1))
digit_product()
然后我想把这些数字列表加倍,最终得到24。
答案 0 :(得分:7)
你的正则表达式\d+
是罪魁祸首。 +
表示它匹配一个或多个连续数字(\d
):
asdf34fh2
^- ^
\ \_ second match: one or more digits ("2")
\____ first match: one or more digits ("34")
您似乎只想匹配一位数字,因此请使用\d
而不是+
。
答案 1 :(得分:0)
如果你问我,最容易使用理解。
>>> a = "asdf34fh2"
>>> [i for i in a if i in '0123456789']
['3', '4', '2']
或
>>> [i for i in a if i.isdigit()]
['3', '4', '2']
答案 2 :(得分:0)
import re
import functools
def digit_product():
str=input("Enter a string with numbers: ")
finded = re.findall(r'\d', str)
if not finded:
print('Not a string with numbers')
else:
return functools.reduce(lambda x, y: int(x) * int(y), finded)
def digit_product2():
input_text = input("Enter a string with numbers: ")
return functools.reduce(lambda x, y: int(x) * int(y), filter(str.isdigit, input_text))
>>> digit_product()
Enter a string with numbers: a2s2ddd44dd
64
>>> digit_product2()
Enter a string with numbers: a2s2ddd44dd
64
答案 3 :(得分:0)
这是一个方便的单行
print(reduce(lambda x, y: x * y, [int(n) for n in text_input if n.isdigit()]))
无需导入re
。如果可以使用内置函数执行此操作,则应避免导入资源。
同时避免使用str
作为变量名称。它保留给字符串类型。
reduce(lambda …
部分一开始很难搞定。但你可以用它来乘以列表中的所有项目。
算法说明
首先,检查输入字符串中的所有元素(字符)。如果检测到数字,它将作为整数附加到列表中。然后列表将减少到内部所有元素的因子。
你没有说过零值。照顾它,例如
print(reduce(lambda x, y: x * y, [int(n) for n in text_input if n.isdigit() and n is not '0']))
答案 4 :(得分:-1)
正则表达式很慢并且通常很难处理。为了您的目的,我建议使用内置的函数式编程和列表表达式:
In [115]: a = "asdf34fh2gh39qw3409sdgfklh"
In [116]: filter(lambda x: x.isdigit(), a)
Out[116]: '342393409'
In [117]: [char for char in filter(lambda x: x.isdigit(), a)]
Out[117]: ['3', '4', '2', '3', '9', '3', '4', '0', '9']