정규표현식

jinkyung·2021년 3월 11일
0

Python

목록 보기
11/19
post-custom-banner

로그를 찾을 때 정규 표현식이 아주 많이 쓰인다.


# 정규표현식이 왜 필요한지
data = """
park 800905-1049118
kim  700905-1059119
"""

result = []
for line in data.split("\n"):
    word_result = []
    for word in line.split(" "):
        if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit():
            word = word[:6] + "-" + "*******"
        word_result.append(word)
    result.append(" ".join(word_result))
print("\n".join(result))

data = """
park 800905-1049118
kim  700905-1059119
"""

import re

pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))	# group 1 

같은 결과 출력


import re
p = re.compile("[abc]") # a, b, c중에 1글자가 일치하면 찾았다
m = p.search("a")
print(m)
m = p.search("before")
print(m)
m = p.search("dude")
print(m)
m = p.search("ebc")
print(m)


import re
p = re.compile("[a-zA-Z]")      # 알파벳 모두 해당하면 찾아라
m = p.search("123abc")
print(m)
p = re.compile("[0-9]")         # 숫자 1글자를 찾아라
m = p.search("abc123")
print(m)
p = re.compile("[^0-9]")         # 숫자가 아닌 문자를 찾아라
m = p.search("abc123")
print(m)



# import re
# p = re.compile("\d")            #[0-9]와 같다
# m = p.search("abc123")
# print(m)
# p = re.compile("\D")            #[^0-9]와 같다
# m = p.search("abc123")
# print(m)
# p = re.compile("\s")            # whitespace(공백문자), [ \t\n\r\f\v]
# m = p.search("abc   123")
# print(m)
# p = re.compile("\S")            # [^ \t\n\r\f\v]
# m = p.search("abc   123")
# print(m)
# p = re.compile("\w")            # word (문자+숫자), [a-zA-Z0-9_]
# m = p.search("   abc   123")
# print(m)
# p = re.compile("\W")            # [^a-zA-Z0-9_]
# m = p.search("abc!?   123")
# print(m)


# import re
# p = re.compile("a.b")       # a+모든문자+b
# m = p.search("123a9b")
# print(m)
# m = p.search("aab")
# print(m)
# m = p.search("a0b")
# print(m)
# m = p.search("abc")
# print(m)

import re
p = re.compile("a[.]b")     # a.b을 찾아라
m = p.search("a0b")
print(m)
m = p.search("a.b")
print(m)

import re
p = re.compile("ca*t")      # c와 t사이에 a가 0 ~ 무한대 반복
m = p.search("ct")
print(m)
m = p.search("cat")
print(m)
m = p.search("caaat")
print(m)



import re
p = re.compile("ca+t")      # c와 t사이에 a가 1 ~ 무한대 반복
m = p.search("ct")
print(m)
m = p.search("cat")
print(m)
m = p.search("caaat")
print(m)



import re
p = re.compile("ca{2}t")        # a가 2번 반복
m = p.search("cat")
print(m)
m = p.search("caat")
print(m)
m = p.search("caaaat")
print(m)




import re
p = re.compile("\d{6}[-]\d{7}")
m = p.search("홍길동, 임꺽정, park901010-1089076장길산, 일지매")
print(m)
p = re.compile("[0-9]{6}[-][0-9]{7}")
m = p.search("홍길동, 임꺽정, park901010-1089076장길산, 일지매")
print(m)



import re
p = re.compile("ca{2,5}t")      # c와 t사이에 a가 2~5회 반복
m = p.search("cat")
print(m)
m = p.search("caat")
print(m)
m = p.search("caaaaat")
print(m)
m = p.search("caaaaaaaaat")
print(m)


data = """		# 처음에 사실은 개행문자가 들어가있음 (그래서 none 출력)
ab abc ac ad aaa
abbbbbc
bbbaaaccc
abbbbbbbbbb
"""

data1 = "ab abc ac ad aaa"

import re                   # 정규표현식 모듈 메모리에 로딩
p = re.compile("ab*")       # 표현식을 사용할 수 있게 객체 생성
m = p.match(data)           # 처음부터 일치하는 여부
print(m)
m = p.match(data1)          # 처음부터 일치하는 여부
print(m)
m = p.search(data)           # 어디서든 일치하는 여부
print(m)
m = p.search(data1)          # 어디서든 일치하는 여부
print(m)
m = p.findall(data)         # 일치하는 모든 문자열을 리스트로 반환
print(m)



for d in m:
    print(d)
m = p.finditer(data)        # 일치하는 모든 문자열을 반복객체로 반환(위치까지)
for d in m:
    print(d)



import re
p = re.compile("p[\w]*n")   # p와 n사이 여러개의 문자,숫자
m = p.match("python is easy")
print(m)
print(m.group())
print(m.start())
print(m.end())
print(m.span())


\n : 엔터는 문장을 분리할 때 중요한 역할.
dotall : 엔터도 문자로 쓰겠다. (엔터도 문자로 포함, 여러 줄의 문자열에서 엔터에 상관없이 검색할 때 많이 쓴다.)


import re
p = re.compile("a.b")
m = p.match("a\nb")
print(m)
p = re.compile("a.b", re.DOTALL)    # re.S도 같음 
m = p.match("a\nb")
print(m)


Ignorecase : 대소문자 구분 없이 무시

import re
p = re.compile("[a-z]", re.IGNORECASE)   # re.I 도 같음
# p = re.compile("[a-zA-Z]")
m = p.match("python")
print(m)
m = p.match("Python")
print(m)
m = p.match("PYTHON")
print(m)




# python으로 시작하고, whitespace(공백문자), 숫자or문자가 1개 이상
import re
p = re.compile("^python\s\w+")  # [^]에서는 not, ^는 시작

data = """python one
life is too short
python two
you need python
python three"""

m = p.findall(data)
print(m)


multiline : 각 줄


# ^python   python으로 시작
# python$  python으로 끝
# 와 re.MULTILINE은 함께 사용된다

import re
p = re.compile("^python\s\w+", re.MULTILINE)  # re.M 같은 의미

data = """python one
life is too short
python two
you need python
python three"""

m = p.findall(data)
print(m)



# import re
# p = re.compile("Crow|Servo")  # Crow든 Servo든
# m = p.match("CrowHello")
# print(m)
# m = p.match("ServoHello")
# print(m)


# import re
# p = re.compile("^Life")     # 시작이 Life
# m = p.match("Life is too short")
# print(m)

# import re
# p = re.compile("short$")        # 끝이 short
# m = p.search("Life is too short")
# print(m)
# m = p.search("Life is too short, you need python")
# print(m)
import re
# p = re.compile("ABC+")          # AB다음에 C가 1개 이상
p = re.compile("(ABC)+")        # ()는 그룹을 만든다, ABC가 1개 이상
m = p.search("ABCABCABC OK?")
print(m)
print(m.group())


blue나 white나 red를 color로 바꿔라

# 문자열 바꾸기
import re
p = re.compile("(blue|white|red)")
data = """
blue socks
red socks
white socks
"""
print(p.sub('color', data))

post-custom-banner

0개의 댓글