我正在尝试解析Base: Lote Numero 1, Marcelo T de Alvear 500. Demanda: otras palabras.
之类的句子我想:首先,按句点分割文本,然后使用冒号之前的任何内容作为冒号后句子的label
。
现在我有以下定义:
from pyparsing import *
unicode_printables = u''.join(unichr(c) for c in xrange(65536)
if not unichr(c).isspace())
def parse_test(text):
label = Word(alphas)+Suppress(':')
value = OneOrMore(Word(unicode_printables)|Literal(','))
group = Group(label.setResultsName('label')+value.setResultsName('value'))
exp = delimitedList(
group,
delim='.'
)
return exp.parseString(text)
有点作品,但它会丢弃unicode caracters(以及任何不在alphanums中的内容),我想我希望将value
作为一个整句而不是:{{1 }}
这是解决这个问题的简单方法吗?
答案 0 :(得分:2)
要直接回答您的问题,请使用originalTextFor
包装您的值定义,这将返回匹配标记来自的字符串切片,作为单个字符串。您还可以添加解析操作,例如:
value.setParseAction(lambda t : ' '.join(t))
但是这可能会明确地在每个项目之间放置一个空格,当可能没有空格(在一个单词后面的',')或多个空格时。 originalTextFor
将为您提供确切的输入子字符串。但更简单的是,如果你只是在':'之后阅读所有内容,那就是使用restOfLine
。 (当然,最简单的只是使用split(':')
,但我认为你是专门询问如何用pyparsing来做这件事。)
其他几点说明:
xxx.setResultsName('yyy')
可以缩短为xxx('yyy')
,从而提高解析器定义的可读性。
您将值定义为OneOrMore(Word(unicode_printables) | Literal(','))
有几个问题。首先,','将包含在unicode_printables
中的字符集中,因此','将包含在任何已解析的单词中。解决此问题的最佳方法是使用excludeChars
参数Word
,以便您的句子单词不包含逗号:OneOrMore(Word(unicode_printables, excludeChars=',') | ',')
。现在您还可以排除其他可能的标点符号,例如“;”,“ - ”等,只需将它们添加到excludeChars字符串中即可。 (我只是注意到你使用'。'作为delimitedList
的分隔符 - 为了使其工作,你必须包括'。'作为排除字符。)Pyparsing不像正则表达式这方面 - 如果下一个字符继续匹配当前令牌,则尝试匹配解析器中的下一个令牌并不做任何前瞻。这就是为什么你必须自己做一些额外的工作,以避免阅读太多。一般来说,像OneOrMore(Word(unicode_printables))
那样开放的东西很可能会占用输入字符串的其余部分。
答案 1 :(得分:1)
您应该查看PyICU,它提供对ICU提供的丰富Unicode文本库的访问,包括提供句子查找器的BreakIterator类。