2014-03-04 82 views
0

自從我上次真正使用python以來,它已經有一段時間了。你如何標記用戶輸入?在Python中令牌化用戶輸入

比方說,例如: 用戶輸入:嘿,我的名字叫喬恩

標記生成器將根據空間

+3

你只是在尋找'str.split()'? – cmd

+0

類似的東西,但我希望它看起來像一個樣子,所以在每個實例Tok將具有字符串中的字符的值。例如:當令牌不爲空時,將該值推送到堆棧@cmd –

+0

看起來您希望我們爲您編寫一些代碼。儘管許多用戶願意爲遇險的編碼人員編寫代碼,但他們通常只在海報已嘗試自行解決問題時才提供幫助。證明這一努力的一個好方法是包含迄今爲止編寫的代碼,示例輸入(如果有的話),期望的輸出和實際獲得的輸出(控制檯輸出,堆棧跟蹤,編譯器錯誤 - 無論是適用)。您提供的細節越多,您可能會收到的答案就越多。 –

回答

3

您可以使用正則表達式的組來標記一個字符串:

import re 

tokens = (
    ('STRING', re.compile('"[^"]+"')), # longest match 
    ('ID', re.compile('[a-zA-Z_]+')), 
    ('SPACE', re.compile('\s+')), 
    ('DIGIT', re.compile('\d+')), 
) 

def tokenizer(s): 
    i = 0 
    lexeme = [] 
    while i < len(s): 
    match = False 
    for token, regex in tokens: 
     result = regex.match(s, i) 
     if result: 
     lexeme.append((token, result.group(0))) 
     i = result.end() 
     match = True 
     break 
    if not match: 
     raise Exception('lexical error at {0}'.format(i)) 
    return lexeme 

以字符串abcd xvc 23432 "exampe" 366

for i in tokenizer('abcd xvc 23432 "exampe" 366'): 
    print i 

打印:

('ID', 'abcd') 
('SPACE', ' ') 
('ID', 'xvc') 
('SPACE', ' ') 
('DIGIT', '23432') 
('SPACE', ' ') 
('STRING', '"exampe"') 
('SPACE', ' ') 
('DIGIT', '366') 
+0

是的!這實際上是我在尋找的感謝! –

+0

如果我想在嘗試添加之前檢查令牌的類型讓我們說什麼。你是怎樣做的? @BSH –

+0

@MannyO'isinstance(obj,type)'如果'obj'在任何地方繼承'type',則返回'True'。備選地,只是檢查第一索引在'i'(例如'I [0]'),並檢查其對' 「ID」',' 「SPACE」',' 「DIGIT」',或' 「STRING」' –

0

使用拆分拆分它分割字符串

str.split() 
+0

是的,但讓我們說有一個在那裏的數字,我怎麼單獨指定它作爲一個數字之前推它到堆棧@Amit –

0
> "Hey my name is Jon".split() - 
['Hey', 'my', 'name', 'is', 'Jon'] 

將是簡單的答案。如果您有更復雜的令牌概念(例如,「Jon!」是1或2個令牌),請使用re.findall

> re.findall(r'(\d+)|(\w+)', 'Jon is 10 years old') 
[('', 'Jon'), ('', 'is'), ('10', ''), ('', 'years'), ('', 'old')] 

請注意,這會將數字放在每個元組左側和其他字符串的右側。這將做其他事情,你可能沒有預料

> re.findall(r'(\d+)|(\w+)', 'Hi-yoo') 
[('', 'Hi'), ('', 'yoo')] 

查找一個很好的正則表達式教程瞭解更多。

+0

是的,但讓我們說有一個數字在那裏,如何在將它推入堆棧之前,我將它單獨指定爲一個數字@ U2EF1 –

+2

@MannyO可能類似'[int(token)if token.isdigit()else user_input.split()]中的標記' –

+0

@MannyO什麼adsmith說,如果這變得越來越複雜,請查看如何使用正則表達式組。 – U2EF1

0

您可以使用str.split()做到這一點,但是刪除了空格。如果您想保留空間,請使用list(str)