2013-02-27 23 views
0

我在學python時會瘋了。不能用字符串來形式化變量?

這裏是一個代碼片段:

import re 

class Spam: 
    def egg(self, pat): 
     print pat 


attribute_pattern = r'(\s[a-z\-]+=".*?")*' 

ok_uber_string = '<(us-patent-grant)' r'(\s[a-z\-]+=".*?")*' '>(.*?)(</\1>)' 
bad_uber_string = '<(us-patent-grant)' attribute_pattern '>(.*?)(</\1>)' 
pat = re.compile(bad_uber_string) 

與bad_uber_string將不能編譯,得到一個SyntaxError行:無效的語法

這有可能是用戶錯誤,我究竟做錯了什麼?

感謝 帕特

+1

使用'+'拼接'bad_uber_string ='<(us-patent-grant)'+ attribute_pattern +'>(。*?)()' – avasal 2013-02-27 04:23:37

+0

好的,謝謝,但爲什麼「ok_uber_string」在沒有+的情況下工作 – fishtoprecords 2013-02-27 04:47:37

回答

4

Python會自動膠字符串字面在一起:

some_string = "this will " "be one string" 

在其他情況下,你要使用的+操作的值連接爲一個字符串:

bad_uber_string = '<(us-patent-grant)' + attribute_pattern + '>(.*?)(</\1>)' 

參見:https://stackoverflow.com/a/1732454/65295

3

自動級聯只適用於字符串文字。連接字符串不屬於字符串常量,使用+操作

>>> "foo" "bar" 
'foobar' 
>>> bar = "bar" 
>>> "foo" bar 
    File "<stdin>", line 1 
    "foo" bar 
      ^
SyntaxError: invalid syntax 
>>> "foo" + bar 
'foobar' 

這樣做的原因很簡單 - 自動拼接是在分析時進行,而不是運行時:

>>> def foo(): 
... return "foo" "bar" 
... 
>>> dis.dis(foo) 
    2   0 LOAD_CONST    1 ('foobar') 
       3 RETURN_VALUE   

由於python的動態性質,它無法確定(一般)bar是否包含一個字符串,或一個浮點數或任何其他用戶定義的類型,直到運行時。而特殊情況下,它提前確定簡單,並不是「足以打破規則」(import this)。