簡體   English   中英

在 Python 中從字符串中提取數字

[英]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_stringstr

>>> 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 函數將字符串轉換為列表,然后列表推導可以幫助我們遍歷列表,並且是數字函數有助於從字符串中獲取數字。

從字符串中獲取數字

使用列表理解+isdigit()

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM