반응형
앞에서 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]
반응형
'Python > PYTHON Natural Language Processing' 카테고리의 다른 글
[Python] text 편집 완전 기본 (0) | 2020.09.18 |
---|---|
[Python] text 검색 기본 function#2 (0) | 2020.09.11 |