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: invalid syntax

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

谢谢帕特

4

2 回答 2

4

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

some_string = "this will " "be one string"

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

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

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

于 2013-02-27T04:33:12.963 回答
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)。

于 2013-02-27T04:32:27.783 回答