2017-02-09 80 views
1
PriceStr=group[2] 
price=Decimal(sub(r'[^\d.]', '', PriceStr)) 

在這部分代碼中,貨幣的變量字符串正在轉換爲Decimal。 這段代碼的第二行實際上是什麼意思? 爲什麼需要'sub','r',撇號,'^'等?這個字符串操作在Python中如何工作?

+3

子可能是從https://docs.python.org/3/library/re.html#re.sub導入的 –

回答

2

他們從不同的數字和點串刪除所有符號,

例如 「$ 1,346.9總」轉換爲「1346.9」

0

在Python r'string'意味着原始字符串,即字符串,其中逃逸序列無效。例如比較:

print(r'foo bar\n') 
print('foo bar\n') 

在解釋爲新線的符號第二種情況\n,而在原始字符串它只是一個斜槓和一個字母n。詳細瞭解原始字符串,例如here

方法sub已從模塊re導入。在你的代碼的頂部,你可能會發現這條線:

from re import sub # (or `from re import *`) 

在我看來,最好是import re和訪問subre.sub後,這種方式是明確的。

sub的第一個參數是一個正則表達式。正則表達式(正則表達式)是一個大問題,你可以找到很好的資源來理解它們herehere。這是什麼特定的正則表達式的作用:

  • 定義字符類(方括號[]之間)
  • 告訴這個字符不是數字(\d意味着數字,相同0-9),和^意味着否定(不)
  • 然後它告訴該字符可以是任何東西(在正則表達式點.指任何字符

所謂的正則表達式引擎會尋找這一個字符模式的匹配,例如在abc123它將有3個匹配:a,bcsub的第二個參數告訴用什麼來替換這些匹配。在這裏,您告訴替換爲空(即空字符串,即兩個引號之間沒有任何內容:'')。 sub的第三個參數提供了您想要對其執行此操作的字符串。然後將結果傳遞給名爲Decimal的方法或類,您可以在代碼中查找並找出它的作用。

不是答案的一部分,但一般建議如何更好地處理類似的案件:

如果您想了解這樣一個基本的代碼,你可以導入它的方法,並嘗試他們一個接一個,或者臨時添加print()語句,重新加載模塊並調用方法。例如,讓我們假設你的模塊稱爲pricecalculator,並在具有相同名稱或文件pricecalculator.py一個目錄,然後你去到該目錄中,打開一個Python外殼,並鍵入:

import imp 
import pricecalculator 
from pricecalculator import * 

然後你就可以調用此模塊的任何方法。假設你想知道什麼是變量group,它的第三個元素是什麼?然後添加在您的文章中線上方線print('group: ', group)print('type of group: ', type(group)),並重新加載模塊:

imp.reload(pricecalculator) 
from pricecalculator import * 

然後調用其中的代碼發生的方法,你會看到打印變量的內容。

此外,如果你看到一個方法,你想知道它做了什麼,試着找出它來自哪裏,哪個模塊,並查找方法的文檔。例如:

import re 
# see the documentation: 
help(re.sub) # press `q` to return to shell 

from re import * 
# find the module for a method: 
sub.__module__ 

並嘗試直接在shell中試驗方法,閱讀文檔,嘗試一些東西並理解錯誤消息。 Here is a guide每種錯誤的含義。

最後,在這裏問一個問題之前,總是會想:有沒有機會讓答案幫助別人?試着制定相應的標題和問題。