自从我上次使用python以来已经有一段时间了。你如何标记用户输入?
让我们举例说: 用户输入:嘿,我叫Jon,
Tokenizer将根据空格
拆分它答案 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')
答案 1 :(得分:0)
使用split来分割字符串
str.split()
答案 2 :(得分: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')]
查看一个很好的正则表达式教程以了解更多信息。
答案 3 :(得分:0)
您可以使用str.split()
执行此操作,但这会删除空格。如果您想保留空格,请使用list(str)
。