我正在尝试使用python pyparsing进行解析.在制作递归解析器时我陷入了困境.
让我解释一下这个问题
我想制作元素的笛卡尔积.语法是
cross({elements },{element})
Run Code Online (Sandbox Code Playgroud)
我提出了更具体的方式
cross({a},{c1}) or cross({a,b},{c1}) or cross({a,b,c,d},{c1}) or
Run Code Online (Sandbox Code Playgroud)
所以一般形式是第一组将有n个元素(a,b,c,d).第二组将有一个元素,因此最终输出将是笛卡尔积.
语法是递归的,因为它可以像n级一样
cross(cross({a,b},{c1}),{c2})
Run Code Online (Sandbox Code Playgroud)
这意味着用c1交叉a,b.让我们说结果我们.我们再次与c2交叉
这可以直到n级交叉(交叉(交叉(交叉......)
我想要的是使用setparseAction初始化对象
所以我将有2节课
class object1(object):
This will be used by a,b,c,d
class object2(object):
This will hold cross elements
Run Code Online (Sandbox Code Playgroud)
我需要帮助,我无法做出递归解析器.
我是Python和pyparsing的新手.我需要完成以下任务.
我的示例文本行是这样的:
12 items - Ironing Service 11 Mar 2009 to 10 Apr 2009
Washing service (3 Shirt) 23 Mar 2009
Run Code Online (Sandbox Code Playgroud)
我需要提取项目描述,期间
tok_date_in_ddmmmyyyy = Combine(Word(nums,min=1,max=2)+ " " + Word(alphas, exact=3) + " " + Word(nums,exact=4))
tok_period = Combine((tok_date_in_ddmmmyyyy + " to " + tok_date_in_ddmmmyyyy)|tok_date_in_ddmmmyyyy)
tok_desc = Word(alphanums+"-()") but stop before tok_period
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
如何构建一个匹配特定字符串结尾的python pyparsing结构.例如,假设我想找到以'ing'结尾的所有单词.以下不起作用:
ing_ending = Word(alphas) + Literal("ing") + White();
ing_ending.parseString("jumping")
这在python和regex中很容易做,但在pyparsing中给我带来麻烦.
我试图使用pyparsing解析文本.我的功能如下所示.首先,我构建了一个列表,其中包含我的词典中的所有术语(我网站中常用术语的词典).然后我将我的语法设置为常用单词列表.然后我用语法构造ZeroOrMore对象.最后,我解析字符串,我应该得到我的字符串中找到的匹配项.但是,它会抛出ParseException而不是抱怨文本的结尾是预期的.
def map_dict_words(self, pbody):
dict_terms = [term.term for term in Dictionary.objects()]
look_for_these = oneOf(dict_terms, caseless=True).setResultsName("dict_words")
parseobj = ZeroOrMore(look_for_these)
matches = parseobj.parseString(pbody, parseAll=True)
print matches
Run Code Online (Sandbox Code Playgroud)
根据pyparsing主页http://pyparsing-public.wikispaces.com/FAQs中的FAQ,如果我希望解析器解析整个字符串,我应该将StringEnd()放入我的语法中或使用可选的arg parseAll = True.如果我从我的代码中删除parseAll = True它可以工作,但它不会解析整个字符串.
有任何想法吗?
我有类似的事情(简化版)
class ParseClass(object):
def __init__(self, tokens):
# do some processing on tokens
expr = Word().setParseAction(ParseClass)
Run Code Online (Sandbox Code Playgroud)
有没有办法将一些用户定义的参数发送到ParseClass的init函数?像一些上下文等所以我会 -
class ParseClass(object):
def __init__(self, tokens, context):
# do some processing on tokens based on context
expr = Word().setParseAction(ParseClass, context)
Run Code Online (Sandbox Code Playgroud)
这可能吗?
你如何使下面的正则表达式用于pyparsing?它应该返回给定正则表达式的标记列表.
任何帮助将不胜感激!谢谢!
shell中的python正则表达式示例:
>>> re.split("(\w+)(lab)(\d+)", "abclab1", 3)
>>> ['', 'abc', 'lab', '1', '']
Run Code Online (Sandbox Code Playgroud)
我在pyparsing中尝试了这个,但我似乎无法弄清楚如何正确,因为第一个匹配是贪婪的,即第一个令牌将是'abclab'而不是两个令牌'abc'和'lab'.
pyparsing示例(高级别,即非工作代码):
name = 'abclab1'
location = Word(alphas).setResultsName('location')
lab = CaselessLiteral('lab').setResultsName('environment')
identifier = Word(nums).setResultsName('identifier')
expr = location + lab + identifier
match, start, end = expr.scanString(name).next()
print match.asDict()
Run Code Online (Sandbox Code Playgroud) 我需要解析一个文件,其中包含用大括号分隔的信息,例如:
Continent
{
Name Europe
Country
{
Name UK
Dog
{
Name Fiffi
Colour Gray
}
Dog
{
Name Smut
Colour Black
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在Python中尝试过的
from io import open
from pyparsing import *
import pprint
def parse(s):
return nestedExpr('{','}').parseString(s).asList()
def test(strng):
print strng
try:
cfgFile = file(strng)
cfgData = "".join( cfgFile.readlines() )
list = parse( cfgData )
pp = pprint.PrettyPrinter(2)
pp.pprint(list)
except ParseException, err:
print err.line
print " "*(err.column-1) + "^"
print err
cfgFile.close()
print
return list
if __name__ …Run Code Online (Sandbox Code Playgroud) 在欧洲大陆,csv文件通过分号分隔,因为数字有,而不是.所以,我正在尝试编写与commaSeparatedList相同的semicolonSeparatedList,但是; 代替 ,:
_semicolonsepitem = Combine(OneOrMore(Word(printables, excludeChars=';') +
Optional( Word(" \t") +
~Literal(";") + ~LineEnd() ) ) ).streamline().setName("semicolonItem")
semicolonSeparatedList = delimitedList( Optional( quotedString.copy() | _semicolonsepitem, default="") ).setName("semicolonSeparatedList")
Run Code Online (Sandbox Code Playgroud)
然而解析:
Name;Ref;Address
Run Code Online (Sandbox Code Playgroud)
结果是
['Name']
Run Code Online (Sandbox Code Playgroud)
代替
['Name', 'Ref', 'Address']
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
丹,谢谢你
找到答案:好像我找到了:
_semicolonsepitem = Combine(OneOrMore(Word(printables, excludeChars=';') +
Optional( Word(" \t") +
~Literal(";") + ~LineEnd() ) ) ).streamline().setName("semicolonItem")
semicolonSeparatedList = delimitedList( Optional( quotedString.copy() | _semicolonsepitem, default="") ).setName("semicolonSeparatedList")
Run Code Online (Sandbox Code Playgroud)
我添加了demim =';' 也是delimitedList.
谢谢,丹
我在使用pyparsing模块的Python示例中尝试使用'<<':
whereExpression << whereCondition + ZeroOrMore( ( and_ | or_ ) + whereExpression )
这显然不是一个二进制左移位运算符,但我不觉得它在任何的Python参考.有人可以解释一下吗?谢谢.