๐ด ํ๊ธฐ๋ฅผ ๊ทธ๋๋ก ๋ณด๋ด๋ฉด ์ด๋ฆ์ด ๋๊ฐ๋ค
Article
์ ํธ์์ ์ด๋ ฅ์ ๊บผ๋๋ค. ์ด์ ๊ทธ๊ฑธ ๋ชจ๋ธ์๊ฒ ์ค ์ฐจ๋ก์ธ๋ฐ, ์ฃผ๊ธฐ ์ ์ ๊ฑฐ์ณ์ผ ํ ๊ฒ์ด ์๋ค.
- ์ฐ๋ฆฌ DB์ด๋ฆ ยท ์ ํ ยท ํ๊ธฐ
- ํ๋กฌํํธ์ฌ๊ธฐ์ ๋ถ์ธ๋ค
- ๋ด ๋ ธํธ๋ถ ์6ํธ โ ์ฌ๊ธฐ์ ๋ฉ์ถ๋ค
- ๋ฐ๊นฅ ํ์ฌ ์๋ฒ7ํธ โ ํต์ ๋ฐ๊น์ง ๊ฐ๋ค
1. ๊ทธ๋๋ก ๋ณด๋ด๋ฉด ๋ฌด์์ด ๋๊ฐ๋
๋จผ์ ํ๋กฌํํธ๋ฅผ ๋ง๋ค์ด์ ํ๋ฉด์ ์ฐ์ด๋ณธ๋ค. ๋ณด๋ด์ง๋ ์๋๋ค. ๋ณด๋ด๊ธฐ ์ ์ ๋์ผ๋ก ๋ณด๋ ๊ฒ์ด ์์๋ค.
import sqlite3
con = sqlite3.connect("shop.db")
cur = con.cursor()
customer = cur.execute("""
SELECT name, age, gender, skin_type, phone, email, city
FROM customers WHERE customer_id = 'C007'
""").fetchone()
history = cur.execute("""
SELECT products.name, products.price, purchases.rating, purchases.review
FROM purchases
JOIN products ON purchases.product_id = products.product_id
WHERE purchases.customer_id = 'C007' AND purchases.is_holdout = 0
""").fetchall()
prompt = f"""์๋ ๊ณ ๊ฐ์๊ฒ ์ด์ธ๋ฆด ํ์ฅํ์ ์ถ์ฒํด๋ผ.
[๊ณ ๊ฐ]
{customer}
[๊ตฌ๋งค ์ด๋ ฅ]
"""
for name, price, rating, review in history:
prompt += f"- {name} ({price}์, ๋ณ์ {rating}) : {review}\n"
print(prompt)
- ์๋ ๊ณ ๊ฐ์๊ฒ ์ด์ธ๋ฆด ํ์ฅํ์ ์ถ์ฒํด๋ผ.
- [๊ณ ๊ฐ]
- ('ํ๋ค์', 41, 'F', '๊ฑด์ฑ', '010-3355-1847', 'daeun52@example.com', '์์')
- [๊ตฌ๋งค ์ด๋ ฅ]
- - ๋ณํ ๋งํด ํด๋ ์ง์ค์ผ (28100์, ๋ณ์ 3) : ๋ฌด๋ํด์. ๊ฑด์ฑ์ธ๋ฐ ์๊ทน ์์ด ์ ์ผ์ด์.
- - ํ์๋ฃจ๋ก ์ฐ ํ๋ ฅ ํด๋ ์ง์ค์ผ (25000์, ๋ณ์ 4) : ์ฌ๊ตฌ๋งค์ ๋๋ค. ๊ถ๊ธํ์ ๋ถ์ 010-3355-1847์ผ๋ก ๋ฌธ์์ฃผ์ธ์.
- - ์๊ฒจ ํ๋ ฅ ์ ํฌ๋ฆผ (19500์, ๋ณ์ 5) : ๋ ํต์งธ ์ฐ๋ ์ค์ด์์. ํฅ์ด ์ธ์ง ์์์ ์ข์์.
2. ์ฒซ ์ฒ๋ฐฉ โ ์ ๊ท์์ผ๋ก ์ง์ด๋ค
์ ํ๋ฒํธ๋ ๋ชจ์์ด ์ ํด์ ธ ์๋ค. ์ ๊ท์์ผ๋ก ์ฐพ์ ์ง์ฐ๋ฉด ๋๊ฒ ๋ค๋ ์๊ฐ์ด ์ ์ผ ๋จผ์ ๋ ๋ค. ๋ง๋ ์๊ฐ์ด๋ค.
# re ๋ ์ ๊ท์ ๋๊ตฌ๋ค. ์ ๊ท์์ "์ด๋ฐ ๋ชจ์์ ๊ธ์๋ฅผ ์ฐพ์๋ผ" ๋ฅผ ์ ๋ ๋ฐฉ๋ฒ์ด๋ค.
# ํ์ด์ฌ์ ๊ธฐ๋ณธ์ผ๋ก ๋ค์ด ์๋ค
import re
import sqlite3
con = sqlite3.connect("shop.db")
cur = con.cursor()
# ํ๊ธฐ๋ง 1,500๊ฐ ๊บผ๋ธ๋ค. ๊ฒฐ๊ณผ๋ ('๋ฌด๋ํด์...',) ์ฒ๋ผ ๋ฌถ์์ด๋ผ r[0] ์ผ๋ก ๊ธ์๋ง ๊บผ๋ธ๋ค
reviews = [r[0] for r in cur.execute("SELECT review FROM purchases").fetchall()]
# compile ์ ์ฐพ์ ๋ชจ์์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋ ๊ฒ์ด๋ค. 1,500๋ฒ ์ธ ๊ฑฐ๋ผ ๋ฏธ๋ฆฌ ๋ง๋ค๋ฉด ๋น ๋ฅด๋ค.
# ์์ r ์ "์ญ์ฌ๋์๋ฅผ ๊ทธ๋๋ก ์ฝ์ด๋ผ" ๋ ํ์๋ค. ์ด๊ฒ ์์ผ๋ฉด \d ๊ฐ ๋ค๋ฅธ ๋ป์ด ๋๋ค.
# \d ์ซ์ ํ๋ (digit)
# {4} ๋ฐ๋ก ์์ ๊ฒ์ด ๋ค ๋ฒ
# 010- ์ด ๊ธ์ ๊ทธ๋๋ก
# ํฉ์น๋ฉด "010-๋ค์๋ฆฌ-๋ค์๋ฆฌ" ๊ฐ ๋๋ค
phone = re.compile(r"010-\d{4}-\d{4}")
# search ๋ "์ด ๊ธ์ ๊ทธ ๋ชจ์์ด ์๋" ๋ฅผ ๋ณธ๋ค. ์์ผ๋ฉด ์ฐพ์ ๊ฒ์, ์์ผ๋ฉด None ์ ์ค๋ค.
# sum ์ ๋ํ๋ ํจ์์ธ๋ฐ, ์ฌ๊ธฐ์๋ ์กฐ๊ฑด์ ๋ง๋ ๊ฒ๋ง๋ค 1์ ์ธ๋ ๋ฐ ์ผ๋ค
found = sum(1 for t in reviews if phone.search(t))
print(f"ํ๊ธฐ {len(reviews)}๊ฑด ์ค ์ ํ๋ฒํธ๊ฐ ์กํ ๊ฒ {found}๊ฑด")
# sub ๋ ์ฐพ์ ์๋ฆฌ๋ฅผ ๋ค๋ฅธ ๊ธ์๋ก ๋ฐ๊พผ๋ค (substitute). ์๋ณธ์ ์ ๋ฐ๋๊ณ ๋ฐ๋ ์ฌ๋ณธ์ด ๋์จ๋ค
print(phone.sub("[์ ํ๋ฒํธ]", reviews[3]))
| ์ด๋ฆ | ๋ฌด์จ ๋ป์ธ๊ฐ | ์ ์ฌ๊ธฐ ๋์ค๋ |
|---|---|---|
re | ์ ๊ท์ ๋๊ตฌ | ใ์ด๋ฐ ๋ชจ์์ ๊ธ์ใ๋ฅผ ์ฐพ์ผ๋ ค๊ณ |
r ์ ๋์ด | ์ญ์ฌ๋์๋ฅผ ๊ทธ๋๋ก ์ฝ์ด๋ผ | ์ ๋ถ์ด๋ฉด ์ซ์ ํ์๊ฐ ๋ค๋ฅธ ๋ป์ด ๋๋ค |
| ์ญ์ฌ๋์ + d | ์ซ์ ํ๋ | ๋ค์ {4} ๋ฅผ ๋ถ์ด๋ฉด ๋ค ์๋ฆฌ |
compile | ์ฐพ์ ๋ชจ์์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋ค | 1,500๋ฒ ์ธ ๊ฑฐ๋ผ ๋ฏธ๋ฆฌ |
search | ์๋ ์๋ ๋ณธ๋ค | ์์ผ๋ฉด ์ฐพ์ ์๋ฆฌ, ์์ผ๋ฉด None |
sub | ์ฐพ์ ์๋ฆฌ๋ฅผ ๋ฐ๊พผ๋ค | ์ง์ฐ๊ธฐ๊ฐ ๊ณง ๋ฐ๊พธ๊ธฐ๋ค |
- ํ๊ธฐ 1500๊ฑด ์ค ์ ํ๋ฒํธ๊ฐ ์กํ ๊ฒ 42๊ฑด
- ๊ฐ๊ฒฉ ์๊ฐํ๋ฉด ์ด ์ ๋๋ ํ๋ ๊ฒ ๊ฐ์์. ๊ถ๊ธํ์ ๋ถ์ [์ ํ๋ฒํธ]์ผ๋ก ๋ฌธ์์ฃผ์ธ์.
์ ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ๊ทธ๋ฐ๋ฐ 42๊ฑด์ด ๋ง๋?
3. ๐ด 110๊ฑด์ ๋์ณค๋ค
์ฌ๋์ ์ ํ๋ฒํธ๋ฅผ ํ ๊ฐ์ง ๋ชจ์์ผ๋ก๋ง ์ฐ์ง ์๋๋ค. ํ๊ธฐ๋ฅผ ์ง์ ๋ค์ ธ๋ณธ๋ค.
print(cur.execute("SELECT COUNT(*) FROM purchases WHERE review LIKE '%010%'").fetchone()[0])
- 152
์กํ ๊ฒ
42๊ฑด
- 010-7600-2955
- ํ์ดํ์ด ์๋ ๊ฒ๋ง
๋น ์ ธ๋๊ฐ ๊ฒ
110๊ฑด
- 010 8202 9049 โ ๋์ด์ฐ๊ธฐ
- 01082029049 โ ๋ค ๋ถ์
- ์ฌ๋์ ์ด๋ ๊ฒ๋ ์ด๋ค
์ ๊ท์์ ๋ํ๋ค.
phone = re.compile(r"01[016789][-\s]?\d{3,4}[-\s]?\d{4}")
# ^^^^^^^^^ ๋๊ดํธ = "์ด ์ค ์๋ฌด๊ฑฐ๋ ํ๋". 010 ๋ง๊ณ 011ยท016 ๋ ์๋ค
# ^^^^^ \s = ๋น์นธ, ? = "์์ด๋ ๋๊ณ ์์ด๋ ๋๋ค"
# ^^^^^ {3,4} = "์ธ ๊ฐ ๋๋ ๋ค ๊ฐ". ์๋ ๋ฒํธ๋ ๊ฐ์ด๋ฐ๊ฐ ์ธ ์๋ฆฌ๋ค
print(sum(1 for t in reviews if phone.search(t)))
- 152
์ด๋ฉ์ผ๋ ๊ฐ์ด ์ฒ๋ฆฌํ๋ค.
email = re.compile(r"[\w.]+@[\w.]+\.\w+")
print(sum(1 for t in reviews if email.search(t))) # 46
์ด๋ฒ ํธ์ ๋์จ ๊ฒ
| ์ฐ ๊ฒ ยท ์ ๊ฒ | ์ซ์์ ๋ด์ฉ |
|---|---|
| ํ๊ธฐ์ ์ ํ๋ฒํธ | 152๊ฑด / 1,500๊ฑด |
| ์ฒซ ์ ๊ท์ | 42๊ฑด๋ง ์ก์๋ค. 110๊ฑด์ ๋์ณค๋ค |
| ๋์น ์ด์ | ๋์ด์ฐ๊ธฐ ยท ๋ถ์ฌ์ฐ๊ธฐ ยท ์๋ ๋ฒํธ |
| ๋ํ ์ ๊ท์ | 152๊ฑด ์ ๋ถ |
| ์ด๋ฉ์ผ | 46๊ฑด |
re.compile ยท search ยท sub | ๋ชจ์์ ๋ง๋ค๊ณ ยท ์ฐพ๊ณ ยท ๋ฐ๊พผ๋ค |
| ๋ฐฐ์ด ๊ฒ | ์ง์ด ์์ ์๋ ์๋ฅผ ๋๋ํ ๋ด์ผ ๋์น ๊ฑธ ์๋ค |
๋ฏธ์
- 01
[ํ์] ๋ด ํ๋กฌํํธ์์ ๋ฒํธ๋ฅผ ์ง์ด๋ค
mission_pii_1.py. ์ ํธ๋ค์์ ๋ง๋ ๊ณ ๊ฐ ํ๋กฌํํธ์ ๋ํ ์ ๊ท์์ ๊ฑธ์ด ์ ๊ณผ ํ๋ฅผ ๋๋ํ ์ฐ๋๋ค. - 02
[์์ฉ] ์นดํก ์์ด๋์ ์ฌ๋ ๊ณณ์ ์ธ์ด๋ณธ๋ค
mission_pii_2.py. ํ๊ธฐ์ ์นดํก ์์ด๋๊ฐ 49๊ฑด, ์ฌ๋ ๊ณณ์ด 51๊ฑด ๋ค์ด ์๋ค. ์ด๊ฑด ๊ฐ์ธ์ ๋ณด์ธ๊ฐ ์๋๊ฐ. ์ก์ ์ ์๋์ง ์๋ํด๋ณด๊ณ ํ๋จ๊ณผ ์ด์ ๋ฅผ ํ ์ค๋ก ์ ๋๋ค. - 03
[๋์ ] ๋์น ๊ฒ์ ์ค์ค๋ก ์ฐพ์๋ณธ๋ค
mission_pii_3.py. ์ ๊ท์์ผ๋ก ์ง์ด ๋ค, ๋จ์ ๊ธ์ ์ซ์๊ฐ ๋ช ๊ฐ๋ ๋จ์ ์๋์ง ์ผ๋ค. ์ ํ๋ฒํธ๊ฐ ์๋ ์ซ์์ ์ด๋ป๊ฒ ๊ตฌ๋ถํ ๊น.
[์์ฉ] ์นดํก ์์ด๋๋ ๊ฐ์ธ์ ๋ณด์ธ๊ฐ์ถฉ๋ถํ ๊ณ ๋ฏผํด๋ณธ ๋ค ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ด์ด๋ณด์ธ์
์ ๋ต์ด ํ๋๊ฐ ์๋๋ค. ๊ทธ๋์ ์ด ๋ฏธ์ ์ ๋๋ค.
์นดํก ์์ด๋๋ ๊ทธ๊ฒ๋ง์ผ๋ก ์ฌ๋์ ์ฐพ์ ์ ์๋ค. ์ ํ๋ฒํธ์ ์ฑ๊ฒฉ์ด ๊ฐ๋ค. ๊ทธ๋ฐ๋ฐ ๋ชจ์์ด ์ ํด์ ธ ์์ง ์์ ์ ๊ท์์ผ๋ก๋ ๋ชป ์ก๋๋ค โ ใdohyun65ใ์ ํ๋ฒํ ์์ด ๋จ์ด๋ฅผ ๊ตฌ๋ณํ ๋ฐฉ๋ฒ์ด ์๋ค.
์ฌ๋ ๊ณณ์ ์ข ๋ค๋ฅด๋ค. ใ์์ใ ํ๋๋ก๋ ์ฌ๋์ด ์ ์ฐพ์์ง๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฆยท๋์ด์ ํฉ์ณ์ง๋ฉด ์ฐพ์์ง๋ค. ํ๋์ฉ ๋ณด๋ฉด ๊ด์ฐฎ์๋ฐ ๋ชจ์ด๋ฉด ์ํํด์ง๋ ๊ฒ์ด ๊ฐ์ธ์ ๋ณด์ ์ฑ์ง์ด๋ค.
์ค๋ฌด์ ๋ต์ ์ด๋ ๋ค โ ์ ๋งคํ๋ฉด ์ ๋ณด๋ธ๋ค. ์ถ์ฒ์ ์นดํก ์์ด๋๊ฐ ํ์ํ๊ฐ? ์๋๋ค. ๊ทธ๋ผ ๊ทธ ๋ฌธ์ฅ์ ํต์งธ๋ก ๋นผ๋ ์ํด๊ฐ ๊ฑฐ์ ์๋ค.
# ์ก์ ์ ์๋ ๊ฒ๋ง ์ก๊ณ , ๋ชป ์ก๋ ๊ฒ์ ๋ฌธ์ฅ์งธ ๋บ๋ค
kakao_re = re.compile(r"[^.]*์นดํก[^.]*\.")
contact_re = re.compile(r"[^.]*(๋ฌธ์|์ฐ๋ฝ|๊ณต๊ตฌ|๋ฌธ์)[^.]*\.")
def drop_sentence(text):
"""์ฐ๋ฝ์ ์ฃผ๊ณ ๋ฐ์๋ ๋ฌธ์ฅ์ ํต์งธ๋ก ๋ฒ๋ฆฐ๋ค. ์ทจํฅ๊ณผ ๋ฌด๊ดํ๋ค."""
text = kakao_re.sub("", text)
text = contact_re.sub("", text)
return text.strip()
sample = "์ฌ๊ตฌ๋งค์
๋๋ค. ๋ณตํฉ์ฑ์ธ๋ฐ ์๊ทน ์์ด ์ ์ผ์ด์. ์นดํก ์์ด๋ dohyun65 ์
๋๋ค."
print(drop_sentence(sample))
# -> ์ฌ๊ตฌ๋งค์
๋๋ค. ๋ณตํฉ์ฑ์ธ๋ฐ ์๊ทน ์์ด ์ ์ผ์ด์.๋ฑ๋ง์ ์ง์ฐ๋ ๊ฒ๋ณด๋ค ๋ฌธ์ฅ์ ๋ฒ๋ฆฌ๋ ์ชฝ์ด ๋์ ๋๊ฐ ์๋ค. ใ์นดํก ์์ด๋ [์์ด๋] ์ ๋๋คใ๋ ๋จ๊ฒจ๋ด์ผ ์ทจํฅ์ ์๋ฌด ๋์์ด ์ ๋๋ค.
๊ธฐ์ค์ ํ๋๋ค โ ์ด ๋ฌธ์ฅ์ด ์ถ์ฒ์ ๋์์ด ๋๋๊ฐ. ๋์์ด ์ ๋๋ฉด์ ์ํํ๊ธฐ๋ง ํ ๊ฒ์ ๋ฒ๋ฆฌ๋ ๊ฒ ๋ง๋ค.
์ ๋ฆฌํ๋ฉด
์ฒซ ์ ๊ท์์ด 152๊ฑด ์ค 42๊ฑด๋ง ์ก์๋ค. ๊ทธ๊ฑธ ์์์ฑ ๋ฐฉ๋ฒ์ ์ ๊ท์์ ๋ ธ๋ ค๋ณธ ๊ฒ ์๋๋ผ ์๋ณธ์ด ๋ช ๊ฑด์ธ์ง ์ธ์ด๋ณธ ๊ฒ์ด๋ค.
์ง์ด ์์ ์๋ ์๋ฅผ ๋๋ํ ์ ๋ณด๋ฉด ๋์น ๊ฒ์ ์์ ๋ชป ๋ณธ๋ค. ใ์ง์ ์ต๋๋คใ๋ก ๋๋ด๋ฉด 110๊ฑด์ด ๊ทธ๋๋ก ๋๊ฐ๋๋ฐ ์๋ฌด๋ ๋ชจ๋ฅธ๋ค.
๋ํ ์ ๊ท์์ผ๋ก 152๊ฑด์ ๋ค ์ก์๊ณ , ์ด๋ฉ์ผ 46๊ฑด๋ ๊ฐ์ด ์ฒ๋ฆฌํ๋ค. ๋ชจ์์ด ์๋ ๊ฒ์ ์ด๋ ๊ฒ ์กํ๋ค.
๋ค์ ํธ์ ๋ชจ์์ด ์๋ ๊ฒ์ด๋ค. ์ด๋ฆ์ ์ ๊ท์์ผ๋ก ์ก์ผ๋ ค ํ๋ฉด ์๋ฑํ ๊ฒ์ด ์กํ๊ณ , ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ณ ๊ฐํ๋ก ๋์กฐํด๋ ๊ตฌ๋ฉ์ด ๋จ๋๋ค. ๊ฑฐ๊ธฐ์ ์์๋ฅผ ๋ค์ง๊ฒ ๋๋ค.