不能用字符串连接变量?

时间:2013-02-27 04:22:23

标签: python string

我学习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:无效的语法

这必须是用户错误,我做错了什么?

由于 专利

2 个答案:

答案 0 :(得分:4)

Python会自动将字符串文字粘合在一起:

some_string = "this will " "be one string"

在所有其他情况下,您希望使用+运算符将值连接到字符串:

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

另请参阅:https://stackoverflow.com/a/1732454/65295

答案 1 :(得分: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)。