从Python中的String中提取Number

Uma*_*air 26 python string python-3.x

我是新手Python,我有一个字符串,我想从字符串中提取数字.例如:

str1 = "3158 reviews"
print (re.findall('\d+', str1 ))
Run Code Online (Sandbox Code Playgroud)

输出是 ['4', '3']

我想3158只获得一个Integer,而不是List.

Vis*_*yay 81

您可以使用方法filter数字字符串str.isdigit,

>>> int(filter(str.isdigit, str1))
3158
Run Code Online (Sandbox Code Playgroud)

  • 看起来似乎不适用于Python 3(虽然我不是100%肯定),因为在Python 3中``filter`是一个类并且像你一样调用它返回一个`filter`对象,它是一个可迭代的,并且` int()`不能将过滤器对象强制转换为`int`.在我看来,没有优雅的方式(例如你的答案,不使用正则表达式)这样做是Python 3.有吗? (21认同)
  • 不需要@apricity`list`:`int(''.join(filter(str.isdigit,'test3246')))` (11认同)
  • 添加到Juan的注释:`int(''.join(list(filter(str.isdigit,my_str))))`如果你想要字符串中的所有数字而不是第一个. (8认同)
  • @Ray我迟到了,但我打赌其他人也会遇到同样的问题.你可以使用`int(list(filter(str.isdigit,my_str))[0])`.如果`filter`返回一个iterable,你只需要使用它:) (6认同)
  • 我正在使用 Python3 并收到错误: TypeError: int() argument must be a string, a bytes-like object or a number, not 'filter' (3认同)
  • 我不确定这个解决方案是否适用于数字提取的一般情况。考虑在“3158 评论 3158asdf 4”上使用它。 (2认同)

Irs*_*hat 29

这段代码工作正常.肯定存在一些其他问题:

>>> str1 = "3158 reviews"
>>> print (re.findall('\d+', str1 ))
['3158']
Run Code Online (Sandbox Code Playgroud)

  • 这是一个列表吗,因为问题说,我不想要一个列表。 (3认同)

spa*_*ost 8

你的正则表达式看起来正确.你确定你的变量名没有错吗?在上面的代码中,你混合total_hotel_reviews_stringstr.

>>> import re
>>> s = "3158 reviews"
>>> print re.findall("\d+", s)
['3158']
Run Code Online (Sandbox Code Playgroud)


C-3*_*3PO 8

你已经非常接近最终答案了。您的re.finadall表达式仅缺少括号来捕获所有检测到的数字:

re.findall( '(\d+)', str1 )

对于像 之类的更通用的字符串str1 = "3158 reviews, 432 users",此代码将产生:

输出:['3158','432']

现在要获取整数,您可以使用将字符串转换为整数的函数mapint

A = list(map(int,re.findall('(\d+)',str1)))

或者,您可以使用这个单行循环:

A = [ int(x) for x in re.findall('(\d+)',str1) ]

两种方法同样正确。他们屈服了A = [3158, 432]

原始问题的最终结果result将是数组中的第一个条目A,因此我们得到以下任何表达式:

结果 = list(map(int,re.findall( '(\d+)' , str1 )))[0]

结果 = int(re.findall( '(\d+)' , str1 )[0])

即使 中只有一个数字str1re.findall仍然会返回一个列表,因此您需要A[0]手动检索第一个元素。


650*_*502 7

如果格式那么简单(空格将数字与其余格式分开)那么

int(str1.split()[0])
Run Code Online (Sandbox Code Playgroud)

会做的


Eug*_*ash 7

要从字符串中提取单个数字,您可以使用re.search(),它返回第一个匹配项(或None):

>>> import re
>>> string = '3158 reviews'
>>> int(re.search(r'\d+', string).group(0))
3158
Run Code Online (Sandbox Code Playgroud)

在 Python 3.6+ 中,您还可以索引匹配对象而不是使用group()

>>> int(re.search(r'\d+', string)[0])
3158
Run Code Online (Sandbox Code Playgroud)


dar*_*tar 6

Python 2.7:

>>> str1 = "3158 reviews"
>>> int(filter(str.isdigit, str1))
3158
Run Code Online (Sandbox Code Playgroud)

Python 3:

>>> str1 = "3158 reviews"
>>> int(''.join(filter(str.isdigit, str1)))
3158
Run Code Online (Sandbox Code Playgroud)


Ber*_*ard 5

IntVar = int("".join(filter(str.isdigit, StringVar)))
Run Code Online (Sandbox Code Playgroud)

  • 与公认的答案不同,这确实适用于Python3 (3认同)
  • 这正是问题上方的标签所指出的。#python-3.x (2认同)
  • 与“已接受”答案不同,此解决方案有效。 (2认同)

小智 5

最适合每种复杂类型

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)
Run Code Online (Sandbox Code Playgroud)

输出:

[-23.0, 300.0, 343.0, -34.0, -3.4]
Run Code Online (Sandbox Code Playgroud)