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


+ Recent posts