标签: pyparsing

需要有关使用pyparsing制作递归解析器的帮助

我正在尝试使用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 recursion parsing pyparsing

2
推荐指数
1
解决办法
1667
查看次数

如何在pyparsing中为此编写语法:匹配一组单词但不包含给定模式

我是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

2
推荐指数
1
解决办法
1095
查看次数

使用pyparsing"删除"列表

是否有可能为解析列表提供pyparsing并让它返回原始字符串?

python parsing pyparsing

2
推荐指数
1
解决办法
1054
查看次数

使用pyparsing匹配字符串的特定结尾

如何构建一个匹配特定字符串结尾的python pyparsing结构.例如,假设我想找到以'ing'结尾的所有单词.以下不起作用:

ing_ending = Word(alphas) + Literal("ing") + White(); ing_ending.parseString("jumping")

这在python和regex中很容易做,但在pyparsing中给我带来麻烦.

python pyparsing

2
推荐指数
1
解决办法
419
查看次数

ParseException:预期的文本结束

我试图使用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它可以工作,但它不会解析整个字符串.

有任何想法吗?

python parsing pyparsing

2
推荐指数
1
解决办法
3783
查看次数

在pyparsing中将用户定义的参数传递给setParseAction

我有类似的事情(简化版)

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)

这可能吗?

python pyparsing

2
推荐指数
1
解决办法
735
查看次数

pyparsing中的python正则表达式

你如何使下面的正则表达式用于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)

python regex pyparsing

2
推荐指数
1
解决办法
1656
查看次数

使用curley brakets解析文件

我需要解析一个文件,其中包含用大括号分隔的信息,例如:

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)

python parsing pyparsing

2
推荐指数
1
解决办法
2429
查看次数

pyparsing解析使用分号而不是逗号的csv文件

在欧洲大陆,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.

谢谢,丹

python csv comma pyparsing

2
推荐指数
1
解决办法
6930
查看次数

这在<< Python中是什么意思?

我在使用pyparsing模块的Python示例中尝试使用'<<':

whereExpression << whereCondition + ZeroOrMore( ( and_ | or_ ) + whereExpression )

这显然不是一个二进制左移位运算符,但我不觉得它在任何的Python参考.有人可以解释一下吗?谢谢.

python pyparsing

2
推荐指数
1
解决办法
341
查看次数

标签 统计

pyparsing ×10

python ×10

parsing ×4

comma ×1

csv ×1

recursion ×1

regex ×1