首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python pyparsing字符串: A,b,A,b,b,b*

python pyparsing字符串: A,b,A,b,b,b*
EN

Stack Overflow用户
提问于 2012-09-13 16:26:39
回答 2查看 170关注 0票数 1

我有一个疯狂的问题。

我正在尝试使用pyparsing来解析如下内容:(点是无关紧要的隐藏文本)

代码语言:javascript
复制
...... A
B .......
B .......
...... A
B .......
B .......

我需要的是这样的东西:(将A和B元素连接到一个列表中)

代码语言:javascript
复制
 [ [ [A],[B,B] ], [ [A],[B,B] ] , ...]

这是我的代码,它不工作,只返回第一个A

代码语言:javascript
复制
table = pyparsing.OneOrMore(pyparsing.Group(A + (pyparsing.OneOrMore(pyparsing.Group(B) | pyparsing.SkipTo(B).suppress()))) | pyparsing.SkipTo(A).suppress())

我已经解决了这个pyparsing到如下列表的问题:

代码语言:javascript
复制
[ [A],[B],[B], [A],[B],[B] , ...]

但这是不可接受的,因为A和B元素在一个列表中没有直接联系。

值得一提的是

代码语言:javascript
复制
table1 = pyparsing.ZeroOrMore(pyparsing.Group(A) | pyparsing.SkipTo(A).suppress())
table2 = pyparsing.ZeroOrMore(pyparsing.Group(B) | pyparsing.SkipTo(B).suppress())

工作并返回所有A元素和B元素的列表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-13 21:08:25

是的,你可以将OneOrMore嵌入到其他的OneOrMore中--如果你不能这样做,它会严重限制你可以编写的解析器。

我认为,如果你做得更好,你也许能够调整你现有的解决方案。看看这个玩具示例中是如何定义组的:

代码语言:javascript
复制
test = """
...... A 
B ....... 
B ....... 
...... A 
B ....... 
B ......."""

from pyparsing import Literal, Word, printables, Group, OneOrMore

A = Literal("A")
B = Literal("B")

notAorB = Word(printables, excludeChars="AB")

parser = OneOrMore(Group(A + Group(OneOrMore(B))))
parser.ignore(notAorB)

print parser.parseString(test).asList()

打印:

代码语言:javascript
复制
[['A', ['B', 'B']], ['A', ['B', 'B']]]
票数 1
EN

Stack Overflow用户

发布于 2012-09-13 16:34:35

我想你有两个选择:

  • 重新思考你解析文本的方式,
  • 对你所拥有的保持满意,并在事后清理:你有一个像your_list=[A,B,B,A,B,B]这样的列表吗?你可以直接做

[ [xi,xi+1 + xi+2]表示范围内的i(len(Your_list)//3)]

+将连接两个[B]列表(表示为x[i+1]x[i+1]

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12402239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档