Python/PYTHON Natural Language Processing

[Python] text 검색 기본 function#3: group, ., +

시키테이 2020. 9. 14. 22:19
반응형

앞에서  pattern은 이런 식으로 r'/d{3}-/d{3}-/d{4}' 이렇게 표현할 수 있다고 하는데요. 이번에는 이걸 하나씩 그룹으로 묶을 수도 있습니다. 예를 들어 숫자 안에 괄호를 넣어서, pattern을 만든 다음에, 

pattern=r'(/d{3}-)(/d{3}-)(/d{4})' 
text="my phone is 123-456-0022"
mymatch=re.search(pattern, text)

이걸 그룹으로 묶은 다음에 각 그룹의 내용을 검색하라고 하면 됩니다. 

mymatch.group() # 전체 결과
mymatch.group(0) # 전체 결과
mymatch.group(1) # 결과는 123
mymatch.group(2) # 결과는 456

  각 숫자가 들어간 모든 단어들을 뽑아내라고 하면 .을 이용하면 됩니다. 예를 들어  아래처럼 돌립니다. 

re.findall(r".\d", 'my2 m2y 2my 2') # 결과는 ['y2', 'm2', '2', '2']
re.findall(r"..\d", 'my2 m2y 2my 2') # 결과는 ['my2', ' m2', 'y 2', 'y 2']
re.findall(r"\d.", 'my2 m2y 2my 2') # 결과는 ['2 ', '2y', '2m']
re.findall(r"\d..", 'my2 m2y 2my 2') # 결과는 ['2 m', '2y ', '2my']

 

근데 . 은 정확한 찾고자 하는 문자/숫자의 수를 알아야 하기 때문에 쓰기 불편할 수도 있고, 단순히 뭐로 끝나는 문자 앞에 있는 내용을 다 뽑아라 하면

re.findall(r'\S+at',"The bat went splat") #결과는 ['bat', 'splat']

\S가 생각보다 유용합니다. 빈칸 빼고 다 찾아 이런 의미이니까요. \d랑 \S의 결합.

re.findall(r"\d\S", 'my2 m2y 2my 2 23')
# 결과는 ['2y', '2m', '23']

 

그런데 \d든 \S든 하나만 사용하면 뭐로 시작하는 것 검색이 생각보다 어려울 수 있어요 아래처럼. 다른 단어인데도 abs만 뽑죠. 왜냐하면 \S는 문자 하나만 얘기하는 거라

re.findall(r'ab+\S',"An absurd and abstruse story") #결과는 ['abs', 'abs']

이 때 사용하는 게  +입니다. \S 다음에 +를 붙여주면, 문자가 몇 개든 끝날 때까지 ab로 시작하는 거 빈칸 나올 때까지 다 뽑아라. 첫번째 더하기는 결합하라는 얘기이고 두번째 더하기는 그 이외의 것을 쫙 다 찾아라는 의미.

re.findall(r'ab+\S+',"An absurd, superb, and abstruse story") 
#결과는 [absurd], [abstruse]

그럼 반대로 rb로 끝나는 단어를 찾아라 하면 어떻게 하면 될까요? 다음과 같이 하면 됩니다. 

re.findall(r'\S+rb',"An absurd, superb, and abstruse story") 
# 결과는 [superb]

만약에 위에서 +를 안 넣어주면 다음과 같이  [erb]만 뽑아낼 겁니다. 

re.findall(r'\Srb',"An absurd, superb, and abstruse story") 
#결과는 [erb]
반응형