4

文字列に含まれていないPythonステートメントのすべての部分を返す必要があると思うコードがいくつかあります。しかし、それが私が望むほど厳密であるかどうかはわかりません。基本的には、次の文字列区切り文字を見つけるだけで、同じ区切り文字で閉じられるまで「文字列」状態のままになります。私が考えもしなかった奇妙な事件のために私がしたことには何か問題がありますか?それはPythonが行うことと何らかの形で矛盾しますか?

# String delimiters in order of precedence
string_delims = ["'''",'"""',"'",'"']

# Get non string parts of a statement
def get_non_string(text):

    out = ""
    state = None

    while True:

        # not in string
        if state == None:
            vals = [text.find(s) for s in string_delims]

            # None will only be reached if all are -1 (i.e. no substring)
            for val,delim in zip(vals+[None], string_delims+[None]):
                if val == None:
                    out += text
                    return out

                if val >= 0:
                    i = val
                    state = delim
                    break

            out += text[:i]
            text = text[i+len(delim):]

        else:
            i = text.find(state)
            if i < 0:
                raise SyntaxError("Symobolic Subsystem: EOL while scanning string literal")
            text = text[i+len(delim)]
            state = None

入力例:

get_non_string("hello'''everyone'''!' :)'''")

出力例:

hello!
4

2 に答える 2

3

PythonはPythonコードをトークン化できます。

import tokenize
import token
import io
import collections

class Token(collections.namedtuple('Token', 'num val start end line')):
    @property
    def name(self):
        return token.tok_name[self.num]

def get_non_string(text):
    result = []
    for tok in tokenize.generate_tokens(io.BytesIO(text).readline):
        tok = Token(*tok)
        # print(tok.name, tok.val)
        if tok.name != 'STRING':
            result.append(tok.val)
    return ''.join(result)    

print(get_non_string("hello'''everyone'''!' :)'''"))

収量

hello!

重労働はtokenize.generate_tokensによって行われます。

于 2013-03-26T19:44:38.337 に答える
1

エスケープされた引用符(、、など)を準備していないように見えるため、独自のコードにはいくつかのケースで問題があり"\""ます"""\""""

また:

get_on_string('""')

エラーをスローします。

私はそれを奇妙なケースとは言いません。

于 2013-03-26T19:55:09.257 に答える