我有一个字符串,我想从中提取数字。例如:
输出是
str1 = "3158 reviews"
print (re.findall('\d+', str1 ))
输出是
['4', '3']
我只想得到3158
,最好是作为整数,而不是作为列表。str.isdigit
方法来过滤字符串中的数字。>>> int(filter(str.isdigit, str1))
3158
对于Python3:
int(list(filter(str.isdigit, my_str))[0])
filter
是一个类,像你这样调用它会返回一个可迭代的filter
对象,而int()
不能将filter
对象转换为int
。在我看来,在Python 3中没有优雅的方式(比如你的答案中没有使用正则表达式)来完成这个任务。有吗? - Rayint(list(filter(str.isdigit, my_str))[0])
。如果filter
返回一个可迭代对象,你只需要使用它就行了 :) - JChrisint(''.join(list(filter(str.isdigit, my_str))))
。 - apricityint(''.join(filter(str.isdigit, 'test3246')))
该代码的作用是从字符串中提取数字,然后将其转换为整数。 - uzumaki这段代码可以正常工作。肯定存在其他问题:
>>> import re
>>> str1 = "3158 reviews"
>>> print (re.findall('\d+', str1 ))
['3158']
IntVar = int("".join(filter(str.isdigit, StringVar)))
你的正则表达式看起来正确。你确定你没有在变量名上犯错误吗? 在你上面的代码中,你混淆了 total_hotel_reviews_string
和 str
。
>>> import re
>>> s = "3158 reviews"
>>>
>>> print(re.findall("\d+", s))
['3158']
re.findall
表达式只需要添加括号以捕获所有检测到的数字即可:
对于更一般的字符串,例如re.findall('(\d+)', str1)
str1 = "3158 reviews, 432 users"
,此代码将产生以下结果:
现在,为了获取整数,您可以使用输出:['3158','432']
map
函数将int
函数映射到字符串中进行转换:
或者,您可以使用这个单行循环:A = list(map(int,re.findall('(\d+)',str1)))
这两种方法都是正确的。它们都产生A = [ int(x) for x in re.findall('(\d+)',str1) ]
A = [3158, 432]
。result
将是数组A
中的第一个条目,因此我们得出以下任意一个表达式:
result = list(map(int,re.findall('(\d+)', str1)))[0]
即使result = int(re.findall('(\d+)', str1)[0])
str1
中只有一个数字,re.findall
仍将返回一个列表,因此您需要手动检索第一个元素A[0]
。re.search()
,它返回第一个匹配项(或None
):>>> import re
>>> string = '3158 reviews'
>>> int(re.search(r'\d+', string).group(0))
3158
在Python 3.6+中,您还可以索引匹配对象,而不是使用group()
:
>>> int(re.search(r'\d+', string)[0])
3158
re
模块在 1.5 及更高版本中可用 :) - Eugene Yarmash.findall
方法而非.search
方法。.findall
方法总是返回一个包含string
项的列表。该列表将包含所有找到的值,因此需要一个索引。例如,可以将最后一项作为从后面检索的最后一个索引进行处理:int(re.findall(r'\d+', string)[-1])
。 - s3n0Python 2.7:
>>> str1 = "3158 reviews"
>>> int(filter(str.isdigit, str1))
3158
Python 3:
>>> str1 = "3158 reviews"
>>> int(''.join(filter(str.isdigit, str1)))
3158
int(str1.split()[0])
我愿意做这件事
适用于各种复杂类型
str1 = "sg-23.0 300sdf343fc -34rrf-3.4r" #All kinds of occurrence of numbers between strings
num = [float(s) for s in re.findall(r'-?\d+\.?\d*', str1)]
print(num)
[-23.0, 300.0, 343.0, -34.0, -3.4]
num = float("".join(filter(lambda d: str.isdigit(d) or d == '.', inputString)
['3158']
。 - 101