<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 問題 你有一個字符串,想從左至右將其解析為一個令牌流。 ## 解決方案 假如你有下面這樣一個文本字符串: text = 'foo = 23 + 42 * 10' 為了令牌化字符串,你不僅需要匹配模式,還得指定模式的類型。比如,你可能想將字符串像下面這樣轉換為序列對: tokens = [('NAME', 'foo'), ('EQ','='), ('NUM', '23'), ('PLUS','+'), ('NUM', '42'), ('TIMES', '*'), ('NUM', 10')] 為了執行這樣的切分,第一步就是像下面這樣利用命名捕獲組的正則表達式來定義所有可能的令牌,包括空格: import re NAME = r'(?P<NAME>[a-zA-Z_][a-zA-Z_0-9]*)' NUM = r'(?P<NUM>\d+)' PLUS = r'(?P<PLUS>\+)' TIMES = r'(?P<TIMES>\*)' EQ = r'(?P<EQ>=)' WS = r'(?P<WS>\s+)' master_pat = re.compile('|'.join([NAME, NUM, PLUS, TIMES, EQ, WS])) 在上面的模式中,`?P<TOKENNAME>` 用于給一個模式命名,供后面使用。 下一步,為了令牌化,使用模式對象很少被人知道的 `scanner()` 方法。這個方法會創建一個 `scanner` 對象,在這個對象上不斷的調用 `match()` 方法會一步步的掃描目標文本,每步一個匹配。下面是演示一個 `scanner` 對象如何工作的交互式例子: >>> scanner = master_pat.scanner('foo = 42') >>> scanner.match() <_sre.SRE_Match object at 0x100677738> >>> _.lastgroup, _.group() ('NAME', 'foo') >>> scanner.match() <_sre.SRE_Match object at 0x100677738> >>> _.lastgroup, _.group() ('WS', ' ') >>> scanner.match() <_sre.SRE_Match object at 0x100677738> >>> _.lastgroup, _.group() ('EQ', '=') >>> scanner.match() <_sre.SRE_Match object at 0x100677738> >>> _.lastgroup, _.group() ('WS', ' ') >>> scanner.match() <_sre.SRE_Match object at 0x100677738> >>> _.lastgroup, _.group() ('NUM', '42') >>> scanner.match() >>> 實際使用這種技術的時候,可以很容易的像下面這樣將上述代碼打包到一個生成器中: def generate_tokens(pat, text): Token = namedtuple('Token', ['type', 'value']) scanner = pat.scanner(text) for m in iter(scanner.match, None): yield Token(m.lastgroup, m.group()) # Example use for tok in generate_tokens(master_pat, 'foo = 42'): print(tok) # Produces output # Token(type='NAME', value='foo') # Token(type='WS', value=' ') # Token(type='EQ', value='=') # Token(type='WS', value=' ') # Token(type='NUM', value='42') 如果你想過濾令牌流,你可以定義更多的生成器函數或者使用一個生成器表達式。比如,下面演示怎樣過濾所有的空白令牌: tokens = (tok for tok in generate_tokens(master_pat, text) if tok.type != 'WS') for tok in tokens: print(tok) ## 討論 通常來講令牌化是很多高級文本解析與處理的第一步。為了使用上面的掃描方法,你需要記住這里一些重要的幾點。第一點就是你必須確認你使用正則表達式指定了所有輸入中可能出現的文本序列。如果有任何不可匹配的文本出現了,掃描就會直接停止。這也是為什么上面例子中必須指定空白字符令牌的原因。 令牌的順序也是有影響的。re模塊會按照指定好的順序去做匹配。因此,如果一個模式恰好是另一個更長模式的子字符串,那么你需要確定長模式寫在前面。比如: LT = r'(?P<LT><)' LE = r'(?P<LE><=)' EQ = r'(?P<EQ>=)' master_pat = re.compile('|'.join([LE, LT, EQ])) # Correct # master_pat = re.compile('|'.join([LT, LE, EQ])) # Incorrect 第二個模式是錯的,因為它會將文本<=匹配為令牌LT緊跟著EQ,而不是單獨的令牌LE,這個并不是我們想要的結果。 最后,你需要留意下子字符串形式的模式。比如,假設你有如下兩個模式: PRINT = r'(P<PRINT>print)' NAME = r'(P<NAME>[a-zA-Z_][a-zA-Z_0-9]*)' master_pat = re.compile('|'.join([PRINT, NAME])) for tok in generate_tokens(master_pat, 'printer'): print(tok) # Outputs : # Token(type='PRINT', value='print') # Token(type='NAME', value='er') 關于更高階的令牌化技術,你可能需要查看 [PyParsing](http://pyparsing.wikispaces.com/) 或者 [PLY](http://www.dabeaz.com/ply/index.html) 包。一個調用PLY的例子在下一節會有演示。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看