def col(loc, strg)
'''
返回当前偏移量的列位置。
特别注意,换行位置的列位置为1
'''
test = """\ 12 34 """ assert col(test.find("1"),test)==1 assert col(test.find("2"),test)==2 assert col(test.find("\n"),test)==1
def countedArray(expr, intExpr=None)
'''
"itemlen item1 item2 ... itemn" -> [item1,item2, ... itemN]
''' assert countedArray(Word(alphas)).parseString('3 a b c').asList() == [['a','b','c']] assert countedArray(Word(alphas)).parseString('2 a b c').asList() == [['a','b']]
def delimitedList(expr, delim=",", combine=False )
'''
"item1,item2,...itemN" -> [item1,item2,itemN]
'''
assert delimitedList(Word(nums)).parseString("1,2,3").asList() == ['1','2','3'] assert delimitedList(Word(nums),combine=True).parseString("1,2,3").asList() == ['1,2,3']
def dictOf(key, value )
'''
"k1 v1 k2 v2 ... kN vN" -> {k1:v1,k2:v2,...kN:Vn}
'''
r = dictOf(Word(nums),Word(alphas)).parseString("1 a 2 b") assert r['1'] == 'a' assert r['2'] == 'b'
def downcaseTokens(s,l,t)
'''
setParseAction的回调函数,
用于将字符串转为小写
'''
assert Word(alphas).setParseAction(downcaseTokens).parseString("ABCDE").asList() == ["abcde"]
def indentedBlock(blockStatementExpr, indentStack, indent=True)
'''
匹配缩进快的内容
'''
test = '''\ A B C ''' t = Forward() l = Word(alphas) + indentedBlock(t,[1]) t << (l|Word(alphas)) assert t.searchString(test).asList() == [['A', [['B', [['C']]]]]]
def infixNotation(baseExpr, opList, lpar=Suppress:("("), rpar=Suppress:(")"))
'''
方便编写具有优先级操作符号的字符串,例如四则运算
'''
import operator op_list =[(Suppress('*'),2,opAssoc.LEFT,lambda t:reduce(operator.mul,t[0])), (Suppress('+'),2,opAssoc.LEFT,lambda t:reduce(operator.add,t[0]))] num = Word(nums).setParseAction(lambda t:int(t[0])) assert infixNotation(num,op_list).parseString("1+2*3").asList() == [7]
def keepOriginalText(s, startLoc, t)
'''
setParseAction的回调函数,进行原始数据的保存
'''
assert ZeroOrMore(Word(nums)).setParseAction(keepOriginalText).parseString("1 2 3 4") == ['1 2 3 4']
def line(loc, strg)
'''
返回当前偏移量所在的行内容
'''
test = '''\ 123 456 ''' assert line(4,test) == '456'
def lineno(loc, strg)
'''
返回当前便宜量所在的行号
'''
def locatedExpr(expr)
'''
对expr进行封装,多返回起始偏移量,结束偏移量命名信息
'''
print locatedExpr(Word(nums))('a').parseString("12345").dump()
[[0, '12345', 5]]
- a: [0, '12345', 5]
- locn_end: 5
- locn_start: 0
- value: 12345
def makeHTMLTags(tagStr)
'''
生成html标签
'''
def makeXMLTags(tagStr)
'''
生成xml标签
'''
def matchOnlyAtCol(n)
'''
生成setParseAction回调函数
判断当前列位置
'''
(Literal('a')+Literal('b').setParseAction(matchOnlyAtCol(2))).parseString("abc")
def matchPreviousExpr(expr)
'''
匹配之前表达式的内容
'''
num = Word(nums) (num+':'+matchPreviousExpr(num)).parseString("1:1")
def matchPreviousLiteral(expr)
'''
匹配之前表达式的内容的前缀
'''
def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy())
'''
生成可以嵌套解析的表达式
'''
print nestedExpr(content=Word(nums)).parseString("(1(2)3)").dump()
def oneOf( strs, caseless=False, useRegex=True )
'''
选择匹配其中一个文本
'''
assert oneOf("a bb").parseString("bb").asList() == ['bb']
def operatorPrecedence( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') )
'''
同infixNotation
'''
def originalTextFor(expr, asString=True)
'''
原始内容匹配
'''
assert originalTextFor(OneOrMore(Word(nums))).parseString("1 1 2 ").asList() == ['1 1 2']
def removeQuotes(s,l,t)
'''
setParseAction回调函数
去掉引号
'''
assert quotedString.setParseAction(removeQuotes).parseString("'111'").asList() == ['111']
def replaceWith(replStr)
'''
替换匹配的内容
'''
assert Word(nums).setParseAction(replaceWith("aa")).parseString("1111").asList() == ["aa"]
def srange(s)
'''
生成一个范围内的字符
'''
assert srange("[1-2]") == "12"
def traceParseAction(f)
'''
增加跟踪信息的装饰器
'''
@traceParseAction def func(t): print 'func' return t print Word(nums).setParseAction(func).parseString("11")