대한 파싱 읽을에서 대체입니다 깨지기 쉬운 regex 프로세서. 아래의 파서 예제는 명시된 형식과 다양한 추가 공백 및 할당 표현식의 임의 순서를 처리합니다. 정규 표현식에서 명명 된 그룹을 사용한 것처럼 pyparsing은 결과 이름을 지원하므로 dict 또는 속성 구문 (data [ 'Lint'] 또는 data.Lint)을 사용하여 구문 분석 된 데이터에 액세스 할 수 있습니다. 이후 값이 가능한 형태로 이미 수 있도록
from pyparsing import Suppress, Word, nums, oneOf, Regex, ZeroOrMore, Optional
# define basic punctuation
EQ,LPAR,RPAR,LBRACK,RBRACK = map(Suppress,"=()[]")
# numeric values
integer = Word(nums).setParseAction(lambda t : int(t[0]))
real = Regex(r"[+-]?\d+\.\d*").setParseAction(lambda t : float(t[0]))
# id and assignment fields
idRef = LBRACK + integer("id") + RBRACK
typesep = LPAR + oneOf("D G") + RPAR
lExpr = 'L' + EQ + integer("Lint")
rExpr = 'R' + EQ + integer("Rint")
pExpr = 'p' + EQ + real("pFloat")
eExpr = 'e' + EQ + integer("Eint")
nExpr = 'n' + EQ + integer("Nint")
# accept assignments in any order, with or without leading (D) or (G)
assignment = lExpr | rExpr | pExpr | eExpr | nExpr
line = idRef + lExpr + ZeroOrMore(Optional(typesep) + assignment)
# test the parser
text = "[ 0 ] L= 9 (D) R= 14 (D) p= 0.0347222 e= 10 n= 34"
data = line.parseString(text)
print data.dump()
# prints
# [0, 'L', 9, 'D', 'R', 14, 'D', 'p', 0.034722200000000002, 'e', 10, 'n', 34]
# - Eint: 10
# - Lint: 9
# - Nint: 34
# - Rint: 14
# - id: 0
# - pFloat: 0.0347222
는 또한, 구문 분석 작업은, 구문 분석시에는 현악기> INT 또는 현악기와> 부동 소수점 변환을 수행. (구문 분석에서 이러한 식을 구문 분석하는 동안 숫자로 구성된 단어 (Word(nums)
)는 안전하게 int로 변환되므로 일치하는 문자열을 다시 가져 오는 대신 변환을 수행하는 것이 가장 좋습니다. 문자열의 순서를 다시 처리하고 정수, 부동 소수점 등을 검색하려고합니까?)
다음을 시도하십시오. https://hkn.eecs.berkeley.edu/~dyoo/python/scanf/ –
사실, 당신의 정규 표현식에 관해서 추악한 것은 그것이 주석이 많은 verbose 모드로 작성되지 않는다는 것입니다. 한 줄에 하나의 이름이 붙은 캡쳐 그룹으로 확장하면 그것은 아름답고 (정확하고 효율적이며 유지 보수가 가능하고 완전한 기능을하는) 것이 될 것입니다! – ridgerunner
문제는 정규 표현식이 일부 입력에 바람직하지 않은 일을하도록 바인딩되어 있다는 것입니다. 특히 이상한 문자가 있고 명확한 표준이없는 경우 특히 그렇습니다. 나는 단지 내가 알고있는 것을 원한다. – sudo