我试图解析一个类似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字符(以及任何不在字母表中的字符),我想把value
作为一个完整的句子,而不是这个:'value': [(([u'Lote', u'Numero', u'1', ',', u'Marcelo', u'T', u'de', u'Alvear', u'500'], {}), 1)
。在
是解决这个问题的简单方法吗?在
要直接回答您的问题,请用
originalTextFor
包装您的值定义,这将返回匹配标记来自的字符串片段,作为单个字符串。您还可以添加一个解析操作,例如:但这将显式地在每个项之间放置一个空格,而此时可能没有空格(在单词后面有“,”)或多个空格。
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))
这样的开放式的东西很可能会耗尽输入字符串的其余部分。您应该研究一下PyICU,它提供对ICU提供的富Unicode文本库的访问,包括提供句子查找器的BreakIterator类。在
相关问题 更多 >
编程相关推荐