在Python中对用户输入进行分词
我已经有一段时间没真正用过Python了。怎么把用户输入的内容分词呢?
比如说,用户输入的是:嘿,我的名字是Jon
分词器会根据空格把这句话拆开。
4 个回答
0
你可以用 str.split()
这个方法来实现这个功能,不过这样会把空格去掉。如果你想保留空格的话,可以使用 list(str)
。
0
使用split来分割字符串
str.split()
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
你可以用一组正则表达式来把一个字符串分割成小块:
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')