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: 無効な構文が返されます

これはユーザー エラーに違いありません。何が間違っているのでしょうか?

ありがとうパット

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 に答える