我学习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:无效的语法
这必须是用户错误,我做错了什么?
由于 专利
答案 0 :(得分:4)
Python会自动将字符串文字粘合在一起:
some_string = "this will " "be one string"
在所有其他情况下,您希望使用+
运算符将值连接到字符串:
bad_uber_string = '<(us-patent-grant)' + attribute_pattern + '>(.*?)(</\1>)'
答案 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
)。