Pyparsing에는 기본적인 함수들 이외에 많은 함수들이 있다.

활용하면 더 다양한 구문들을 파싱할 수 있다.

그 중 몇가지 함수를 설명 하겠다.




White()


'\n', space 바 등 공백을 파싱하고 싶을 때 사용한다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pyparsing import Word, alphas, nums, White
text = '''
if(banana() == 0)
{
    apple()
}
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = White() + ident("func")
 
for fn,s,e in parsing.scanString(text):
    print(fn.func)
cs


결과

if
apple





LineStart()


만약 줄 바뀌자마자 바로 오는 단어만 파싱하고 싶을 때 사용 한다.


예제 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pyparsing import Word, alphas, nums, White, LineStart
text = '''
if(banana() == 0)
{
    apple()
}
Orange()
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = LineStart() + ident("func")
 
for fn,s,e in parsing.scanString(text):
    print(fn.func)
cs

결과

if
Orange





Optional()


파싱 하고 싶은 구문의 구성 요소가 가변적일때 사용하면 된다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pyparsing import Word, alphas, nums, White, LineStart
text = '''
banana is sweet
apple is very sweet
carrot is bitter
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = ident("name"+ Keyword("is"+ Optional("very"+ ident("taste")
 
for fn,s,e in parsing.scanString(text):
    print(fn.name, " : ", fn.taste)
cs


결과

banana  :  sweet
apple  :  sweet
carrot  :  bitter





SkipTo()


원하는 단어 이전의 문자열 까지 스킵한다. 말은 스킵이지만 지나치는건 아니고 원하는 단어나 구문이 나오기 전까지의 문자열을 하나의 리스트에 저장한다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pyparsing import Word, alphas, nums, SkipTo, Keyword
text = '''
if(banana is sweet)
{
    apple is very sweet
    carrot is bitter
}
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = Keyword("if"+ "("+ SkipTo("carrot"+ ident("name"+ Keyword("is")  + Optional("very"+ ident("taste")
 
for fn,s,e in parsing.scanString(text):
    print(fn.name, " : ", fn.taste)
cs


결과

carrot : bitter



* text의 밑줄 친 부분이 SkipTo()함수로 파싱되었다.

1
2
3
4
5
6
7
8
9
10
 '''
if(banana is sweet)
{
    apple is very sweet
    carrot is bitter
}
'''
 
cs





ignore()


파싱 하지 않을 요소를 정의해 파싱하지 않고 무시한다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pyparsing import Word, alphas, nums, White, LineStart
text = '''
banana is sweet
apple is very sweet // apple is very delicious
carrot is bitter
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = ident("name"+ Keyword("is"+ Optional("very"+ ident("taste")
parsing.ignore("//" + SkipTo("\n"))
 
for fn,s,e in parsing.scanString(text):
    print(fn.name, " : ", fn.taste)
cs


결과

banana : sweet apple : sweet carrot : bitter


Pyparsing 모듈코드는 Git-hub에 올려져 있으니 궁금한 사항은 찾아보면 된다.

https://github.com/pyparsing/pyparsing/blob/master/pyparsing.py

그 중 내가 사용한 함수들을 설명해 보고자 한다.



word()


word 함수로 원하는 단어를 파싱 할 수 있다.

여기서 alphanums는 알파벳 + 숫자를 의미한다. 만약 다르게 사용하고 싶으면 아래 코드를 참조 하자

1
2
3
4
5
6
from pyparsing import Word
 
ident = Word(alphanums)  # 알파벳 + 숫자
ident_2 = Word(alphas)  # 알파벳 + 숫자
ident_3 = Word(nums)     # Only 숫자
ident_4 = Word(alphanums + '_'# '_' 도 포함
cs



예제

1
2
3
4
5
6
7
8
9
10
11
12
from pyparsing import Word, alphas, nums
text = '''
I have 2 apples and 1 banana
'''
 
ident = Word(alphas)
ident_2 = Word(nums)
 
parsing = ident_2("number"+ ident("fruit")
 
for fn,s,e in parsing.scanString(text):
    print('fruit :', fn.fruit, ' number : ', fn.number )
cs

결과

fruit : apples  number :  2
fruit : banana  number :  1



* PyParsing 코드에 정의된 부분을 보면 좀 더 이해가 잘될거다.

1
2
3
4
5
6
7
8
# PyParsing 코드 일부
 
alphas     = string.ascii_uppercase + string.ascii_lowercase
nums       = "0123456789"
hexnums    = nums + "ABCDEFabcdef"
alphanums  = alphas + nums
_bslash    = chr(92)
printables = "".join(c for c in string.printable if c not in string.whitespace)
cs





Keyword()


word를 이용해 원하는 자료형을 파싱할 수 있다면 KetWord는 특정 단어를 파싱하는 방법이다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pyparsing import Word, Keyword, alphanums
 
text = '''
#define prototype.h
int a = 0
if(a == 1):
    print("done")
'''
 
ident = Word(alphanums + "." + "_")
parsing = Keyword("#define"+ ident("name")
 
for fn,s,e in parsing.scanString(text):
    print(fn.name)
cs


결과

prototype.h





응용


만약 2개 이상의 특정 단어를 파싱하고 싶다면 Keyword로는 범용적으로 파싱이 불가능 하다.

이럴때는 Word를 이용하면 쉽게 파싱이 가능하다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pyparsing import Word, Keyword, alphanums
 
text = '''
I have many fruit
banana = 3
carrot = 1
apple = 2
tomaoto = 5
'''
 
ident = Word(alphanums)
fruit = Word("banana" + "apple")
parsing = fruit("name"+ "=" + ident("num")
 
for fn,s,e in parsing.scanString(text):
    print(fn.name, "->", fn.num)
cs

결과

banana -> 3
apple -> 2


간단하게 c코드를 파싱할 일이 생겼다. 

파이썬을 이용해 파싱을 해보고자 파이썬 파싱을 검색을 했다. 


웹 크롤링 관련 글만 보였다. 

웹 크롤링을 응용하기엔 내가 무지하였다.


PyParsing이란 모듈을 발견 하였다. 

하지만 PyParsing을 설명해주는 한글 블로그는 없었고 나는 영어를 못했다.


그래서 이후 c코드를 파싱 하고 싶어하는 사람들을 위해 간단하게 한글 사용법을 남기려 한다.




파싱(Parsing) 이란?


파싱(Parsing) : 일련의 문자열을 분석, 분해하여 원하는 형태로 재 구성한 것.





PyParsing


Pyparsing : 간단한 파이썬 파싱 모듈. 




PyParsing 다운 방법


파싱을 하기에 앞서 필요한 모듈 PyParsing을 다운 받아보자  

간단하다 pip을 이용해 아래와 같이 입력해 다운받으면 된다.

아나콘다를 사용하지 않는다면 윈도우에서 pip 다운로드 사용방법을 검색해 보자


pip install pyparsing


이후 코드에 pyparsing을 import 해 모듈을 사용하면 된다.


1
import pyparsing
cs


+ Recent posts