这是一个简单的扫描程序,它根据特定规则对文本进行标记,并标记标记。
示例:的
import re
def alpha(scanner,token):
return token, 'a'
def numeric(scanner,token):
return token,'rn'
def punctuation(scanner,token):
return token, 'p'
def superscript(scanner,token):
return token, 'sn'
scanner = re.Scanner([
(u"[a-zA-Z]+", alpha),
(u"[.,:;!?]", punctuation),
(u"[0-9]+", numeric),
(u"[\xb9\u2070\xb3\xb2\u2075\u2074\u2077\u2076\u2079\u2078]", superscript),
(r"[\s\n]+", None), # whitespace, newline
])
tokens, _ = scanner.scan("This is a little test? With 7,9 and 6.")
print tokens
出:
[('This', 'a'), ('is', 'a'), ('a', 'a'), ('little', 'a'), ('test', 'a'),
('?', 'p'), ('With', 'a'), ('7', 'rn'), (',', 'p'), ('9', 'rn'),
('and', 'a'), ('6', 'rn'), ('.', 'p')]
ps!定义的函数可能会尝试进一步对标记进行分类。
答案 0 :(得分:3)
re.Scanner
符合所提供顺序的模式。因此,您可以在最后提供一个非常通用的模式来捕获“未知”字符:
(r".", unknown)
import re
def alpha(scanner,token):
return token, 'a'
def numeric(scanner,token):
return token,'rn'
def punctuation(scanner,token):
return token, 'p'
def superscript(scanner,token):
return token, 'sn'
def unknown(scanner,token):
return token, 'uk'
scanner = re.Scanner([
(r"[a-zA-Z]+", alpha),
(r"[.,:;!?]", punctuation),
(r"[0-9]+", numeric),
(r"[\xb9\u2070\xb3\xb2\u2075\u2074\u2077\u2076\u2079\u2078]", superscript),
(r"[\s\n]+", None), # whitespace, newline
(r".", unknown)
])
tokens, _ = scanner.scan("This is a little test? With 7,9 and 6. \xa0-\xaf")
print tokens
产量
[('This', 'a'), ('is', 'a'), ('a', 'a'), ('little', 'a'),
('test', 'a'), ('?', 'p'), ('With', 'a'), ('7', 'rn'), (',', 'p'),
('9', 'rn'), ('and', 'a'), ('6', 'rn'), ('.', 'p'), ('\xa0', 'uk'),
('-', 'uk'), ('\xaf', 'uk')]
您的部分模式为unicode
,其中一种为str
。确实,在Python2中,要匹配的模式和字符串可以是unicode
或str
。
然而,in Python3:
Unicode字符串和8位字符串不能混用:也就是说,你不能 将Unicode字符串与字节模式匹配,反之亦然
因此,即使在Python2中也不要混用它们。
我认为你的代码非常简单(除了superscript
正则表达式.Eek!)。我不知道哪个库会让它变得更简单。