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))
import re
data = """
park 800905-1049118
kim 700905-1059119
"""
pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))
정규 표현식에서 사용하는 메타문자 : . ^ $ * + ? { } [ ] \ | ( )
문자 클래스 [ ]
[와 ] 사이의 문자들과 매치
[^0-9]
은 숫자가 아닌 문자만 매치된다.Dot(.)
a.b
: a와 b사이에 줄바굼 문자를 제외한 어떤 문자가 들어가도 매치됨.a[.]b
: a와 b 사이에 Dot(.) 문자가 있으면 매치반복(*)
ca*t
: a가 0번이상 반복되면 매치반복(+)
ca+t
: a가 1번 이상 반복되면 매치반복({m, n}, ?)
ca{2}t
: a가 2번 반복되면 매치cat{2,5}t
: a가 2번이상 5번이하로 반복되면 매치ca?t
: a가 0번 또는 1번 반복되면 매치파이썬에서 정규 표현식을 지원하는 모듈 : re 모듈
import re
match
import re
p = re.compile('[a-z]+')
m = p.match("python") # 부합
m = p.match("3 python") # 3이라는 문자가 정규식에 부합하지 않음
# 코딩 예시
import re
p = re.compile(정규식)
m = p.match("조사할 문자열")
if m:
매치
else:
매치 안됨
match 객체의 메서드
search
findall
finditer
모듈 단위로 수행하기
p = re.compile('[a-z]+')
m = p.match("python")
m = re.match('[a-z]+', "python")
컴파일 옵션
백슬레쉬 문제
p = re.compile('\\section')
을 사용해야 한다.p = re.compile('\\section')
== p = re.compile(r'\sectino')
(ABC)+
: ABC와 1번 이상 매치되는 것을 찾는다!!
import re
p = re.compile('(ABC)+')
m = p.search('ABCABCABC OK?')
그룹을 인덱스가 아닌 이름을 참조할 수 있다.
(?P<name>\w+)\s+((\d+)[-]\d+[-]\d+)
(?P<이름>...)
과 같이 이름을 붙일 수 있다.전방 탐색
<!-- 생성하려는 xml -->
<note date="20151231">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
from xml.etree.ElementTree import Element, dump
note = Element("note")
to = Element("to")
to.text = "Tove"
note.append(to)
dump(note)
<note><to>Tove</to></note>
from xml.etree.ElementTree import Element, dump
note = Element("note")
to = Element("to")
to.text = "Tove"
note.append(to)
SubElement(note, "from").text = "Jani"
dump(note)
<note><to>Tove</to><from>Jani</from></note>
dummy = Element("dummy")
note.insert(1, dummy)
note.remove(dummy)
from xml.etree.ElementTree import Element, dump
note = Element("note")
to = Element("to")
to.text = "Tove"
note.append(to)
SubElement(note, "from").text = "Jani"
note.attrib["date"] = "20120104"
dump(note)
from xml.etree.ElementTree import Element, dump
note = Element("note")
note.attrib["date"] = "20151231"
subElement(note, "to").text = "Tove"
SubElement(note, "from").text = "Jani"
SubElement(note, "heading").text = "Reminder"
SubElement(note, "body").text = "Don't forget me this weekend!"
dump(note)
from xml.etree.ElementTree import Element, dump
note = Element("note")
note.attrib["date"] = "20151231"
subElement(note, "to").text = "Tove"
SubElement(note, "from").text = "Jani"
SubElement(note, "heading").text = "Reminder"
SubElement(note, "body").text = "Don't forget me this weekend!"
def indent(elem, level=0):
i = '\n' + level * ' '
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + ' '
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
indent(note)
dump(note)
from xml.etree.ElementTree import parse
tree = parse("note.xml")
note = tree.getroot()
# 어트리뷰트 얻기
date = note.get("date")
nodata = note.get("nodata", "기본값")
keys = note.keys()
items = note.items()
# 태그 접근
to_tag = note.find("to")
to_tags = note.findall("to")
to_text = note.findtext("to")
# 순차 접근
childs = note.getiterator()
childs = note.getChildren()
# 태그명으로 접근
from_tag = note.getiterator("from")
# 일반적인 사용
for parent in tree.getiterator():
for child in parent:
# 수행 문장