[파이썬] 정규표현식 9 (findall, sub, sub 교체함수, sub 찾은 문자열 재사용)

패턴에 매칭되는 모든 문자열 가져오기 findall

re.findall('패턴', '문자열')

import re

r = re.compile('[0-9]+')
test1 = r.findall("12 2 Fizz 4 Buzz Fizz 7 8")

print(test1, sep='\n')
['12', '2', '4', '7', '8']

그룹 지정 없이 패턴에 매칭되는 모든 문자열을 가져오기

findall 함수를 사용하며 매칭된 문자열을 리스트로 반환


문자열 바꾸기 sub

re.sub('패턴', '바꿀문자열', '문자열', 바꿀횟수)

문자열을 바꿀 때는 sub 함수를 사용

바꿀 횟수를 넣으면 지정된 횟수만큼 바꾸며 바꿀 횟수를 생략하면 찾은 문자열을 모두 바꾼다

import re

r = re.compile('[0-9]+')
test1 = r.sub("CHANGE", "12 2 Fizz 4 Buzz Fizz 7 8")
test2 = r.sub("CHANGE", "12 2 Fizz 4 Buzz Fizz 7 8", 2)

print(test1, test2, sep='\n')
CHANGE CHANGE Fizz CHANGE Buzz Fizz CHANGE CHANGE
CHANGE CHANGE Fizz 4 Buzz Fizz 7 8

test2는 2번만 바꾸려고 하기 때문에 2개만 바꿔진 것이다.


문자열 바꾸기 sub 교체함수

import re

def multiple10(m):
    return str(int(m.group()) * 10)

r = re.compile('[0-9]+')
# 함수로
test1 = r.sub(multiple10, "12 2 Fizz 4 Buzz Fizz 7 8")
# lambda 로
test2 = r.sub(lambda m: str(int(m.group()) * 10), "12 2 Fizz 4 Buzz Fizz 7 8", 2)

print(test1, test2, sep='\n')
120 20 Fizz 40 Buzz Fizz 70 80
120 20 Fizz 4 Buzz Fizz 7 8

위와 같이 sub 함수는 바꿀 문자열 대신 교체 함수를 지정할 수도 있다

교체 함수는 매개변수로 match 객체를 받으며 바꿀 결과를 문자열로 반환


찾은 문자열을 결과에 다시 사용하기

re.sub('(패턴)', '\\그룹숫자', '문자열', 바꿀횟수)

형태 : \\숫자

정규표현식을 그룹으로 묶는다

import re

test = re.sub('([a-z]+) ([0-9]+)', '\\2 \\1 \\2 \\1', 'hello 1234')

print(test)
1234 hello 1234 hello

정규표현식을 그룹으로 묶는다

바꿀 문자열에서 \\숫자 형식으로 매칭된 문자열을 가져와서 사용할 수 있다


찾은 문자열을 결과에 다시 사용하기 활용

import re

test = re.sub('({\s*)\"(\w+)\"\s*:\s*\"?(\w+)\"?(\s*})', '<\\2>\\3</\\2>', '{ "name" : "james" }')

print(test)
<name>james</name>

딕셔너리를 태그 처럼 바꾸는 느낌




찾은 문자열을 결과에 다시 사용하기 (그룹의 이름으로)

re.sub('(?P<그룹이름>패턴)', '\\g<그룹이름>', '문자열', 바꿀횟수)

re.sub('(?P<그룹이름>패턴)', '\\g<그룹번호>', '문자열', 바꿀횟수)

숫자 또한 그냥 가능하다

그룹이름

import re

test = re.sub('({\s*)\"(?P<key>\w+)\"\s*:\s*\"?(?P<value>\w+)\"?(\s*})', '<\\g<key>>\\g<value></\\g<key>>', '{ "name" : "james" }')

print(test)
<name>james</name>

그룹숫자

import re

test = re.sub('({\s*)\"(?P<key>\w+)\"\s*:\s*\"?(?P<value>\w+)\"?(\s*})', '<\\g<2>>\\g<3></\\g<2>>', '{ "name" : "james" }')

print(test)
<name>james</name>

댓글남기기