[英]Extract Number from String in Python
我是Python
新手,我有一个字符串,我想从字符串中提取数字。 例如:
str1 = "3158 reviews"
print (re.findall('\d+', str1 ))
输出是['4', '3']
我只想获得3158
,最好是整数,而不是列表。
您可以使用str.isdigit
方法按数字filter
字符串,
>>> int(filter(str.isdigit, str1))
3158
这段代码工作正常。 肯定还有其他问题:
>>> str1 = "3158 reviews"
>>> print (re.findall('\d+', str1 ))
['3158']
您的正则表达式看起来正确。 你确定你没有弄错变量名吗? 在您上面的代码中,您混淆total_hotel_reviews_string
和str
。
>>> import re
>>> s = "3158 reviews"
>>>
>>> print(re.findall("\d+", s))
['3158']
IntVar = int("".join(filter(str.isdigit, StringVar)))
你非常接近最终答案。 您的re.finadall
表达式仅缺少括号以捕获所有检测到的数字:
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
中的第一个条目,因此我们得到以下任何表达式:
结果 = list(map(int,re.findall( '(\d+)' , str1 )))[0]
结果 = 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
最适合每种复杂类型
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]
如果格式那么简单(一个空格将数字与其他数字分开),那么
int(str1.split()[0])
会做的
上述解决方案似乎假设整数。 这是允许小数的小修改:
num = float("".join(filter(lambda d: str.isdigit(d) or d == '.', inputString)
(不考虑 - 符号,并假设任何句点都正确放置在数字字符串中,而不仅仅是一些英语句点。它不是坚不可摧的,但适用于我的数据案例。)
Vishnu 的回答中的代码可能有一点问题。 如果字符串中没有数字,它将返回 ValueError。 这是我的建议避免这种情况:
>>> digit = lambda x: int(filter(str.isdigit, x) or 0)
>>> digit('3158 reviews')
3158
>>> digit('reviews')
0
对于python3
input_str = '21ddd3322'
int(''.join(filter(str.isdigit, input_str)))
> 213322
我的回答不需要任何额外的库,而且很容易理解。 但是您必须注意,如果字符串中有多个数字,我的代码会将它们连接在一起。
def search_number_string(string):
index_list = []
del index_list[:]
for i, x in enumerate(string):
if x.isdigit() == True:
index_list.append(i)
start = index_list[0]
end = index_list[-1] + 1
number = string[start:end]
return number
a = []
line = "abcd 3455 ijkl 56.78 ij"
for word in line.split():
try:
a.append(float(word))
except ValueError:
pass
print(a)
输出
3455.0 56.78
我是编码的初学者。 这是我回答这些问题的尝试。 使用 Python3.7 版本,不导入任何库。
此代码从由空格(单词)分隔的字符集组成的字符串中提取并返回一个十进制数。
注意:如果有多个数字,则返回最后一个值。
line = input ('Please enter your string ')
for word in line.split():
try:
a=float(word)
print (a)
except ValueError:
pass
对于 Python 2.7:
>>> str1 = '~ 44 million people'
>>> int(filter(str.isdigit, str1))
44
麻烦,但对于 Python 3:
>>> str1 = '~ 44 million people'
>>> int(''.join(filter(str.isdigit, str1)))
44
#使用这个,这是从一般字符串中提取数字。 #获取所有出现的数字。
*split 函数将字符串转换为列表,然后列表推导可以帮助我们遍历列表,并且是数字函数有助于从字符串中获取数字。
test_string = "i have four ballons for 2 kids"
print("The original string : "+ test_string)
# list comprehension + isdigit() +split()
res = [int(i) for i in test_string.split() if i.isdigit()]
print("The numbers list is : "+ str(res))
#在python中从字符串中提取数值
*使用re.findall(expression,string)
方法查找字符串中由小写字符分隔的所有整数的列表。
*将字符串形式的每个数字转换为十进制数,然后找到它的最大值。
import re
def extractMax(input):
# get a list of all numbers separated by lower case characters
numbers = re.findall('\d+',input)
# \d+ is a regular expression which means one or more digit
number = map(int,numbers)
print max(numbers)
if __name__=="__main__":
input = 'sting'
extractMax(input)
您可以使用以下方法从字符串中提取所有数字。
def extract_numbers_from_string(string):
number = ''
for i in string:
try:
number += str(int(i))
except:
pass
return number
(或)您可以使用i.isdigit()
或i.isnumeric
(在 Python 3.6.5 或更高版本中)
def extract_numbers_from_string(string):
number = ''
for i in string:
if i.isnumeric():
number += str(int(i))
return number
a = '343fdfd3'
print (extract_numbers_from_string(a))
# 3433
使用列表推导和 Python 3:
>>> int("".join([c for c in str1 if str.isdigit(c)]))
3158
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.