Pythonコアプログラミング第3版-第1章練習問題の答え


1.6練習
正規表現
1-1    [bh][aiu]t;
1-2   \w+\w+;
1-3   \w+,\s\w+;
1-4     [A-Za-z_]+[\w_]+
python有効識別子の定義:
1.pythonの識別子は大文字と小文字を区別します.2.ラベルはアルファベットまたはアンダースコアで始まり、アルファベット、アンダースコア、数値を含むことができます.3.下線で始まる識別子は、特別な意味を持つ.
1-5   \d+(\s\w+)+
1-6    (1)^w{3}://.+com/?$    (2)^\w+://.+?\.\w{3}/?$
1-7    [\+-]?\d+
1-8    [\+-]?d+[lL](注:python 3はintと長い整数を統合しており、123 Lという表現はありません)
1-9    [\+-]?\d*\.d*(注:ここで*を用いるのは、.1は0.1、1は1.0を表すため)
1-10  ([\+-]?\d*(\.\d*)?){2}i?
1-11 \w+[\w_-\.]*\w+@\w+\.\w{2,3}
メール表示:ユーザー名+@+メールボックスドメイン名.com/org/cn...
有効な電子メールアドレス:ユーザー名、自分で選択できます.アルファベット、数値、ポイント、マイナス記号、または下線で構成されます.数字またはアルファベットの先頭と末尾しか使用できません.
1-12  https?://[\w_\.-]*\w+/?(有効URLとは何のルールなのか分からないし、この答えも完全にマッチできるかどうか分からない)
1-13 \s'(.+)'
1-14  1[0-2]
1-15 
(1)\d{4}-(\d+)-(\d+)(?:-(\d{4}))?
(2)
def check(card):
    contexts = re.search(r'\d{4}-(\d+)-(\d+)(?:-(\d{4}))?', card).groups()
    if not contexts[2] and len(contexts[0]) == 6 and len(contexts[1]) == 5:
        return True
    elif contexts[2] and len(contexts[0]) == 4 and len(contexts[1]) == 4 and len(contexts[2]) == 4:
        return True
    else:
        return False

gendataを使用する.py
1-16  
from random import *
from string import ascii_lowercase as lc
from sys import *
from time import *

tlds = ('com', 'edu', 'net', 'org', 'gov')
with open('reddata.txt', 'w') as f:
    for i in range(randrange(5, 11)):
        dtint = randrange(maxsize)
        dtstr = ctime(dtint)
        llen = randrange(4, 8)
        login = ''.join(choice(lc) for j in range(llen))
        dlen = randrange(llen, 13)
        dom = ''.join(choice(lc) for j in range(dlen))
        f.write('%s::%s@%s.%s::%d-%d-%d
' % (dtstr, login, dom, choice(tlds), dtint, llen, dlen))

1-17
import re


def Count(filename):
    weeks = {}
    with open(filename) as f:
        contexts = f.read()
        result = re.findall(r'(\w{3})\s\w{3}', contexts)
        for i in result:
            weeks[i] = weeks.get(i, 0) + 1

    return weeks


weeks = Count('reddata.txt')
print(weeks)

1-18何度も読みましたが、まだこの問題の意味が理解できません.
1-19 \w{3}\s.*?\s\d{4}
1-20 \w+@\w+\.\w{3}
1-21 \s(\w{3})\s
1-22 \s(\d{4})
1-23 \d{2}:\d{2}:\d{2}
1-24  (\w+)@(\w+\.\w{3})
1-25  (\w+)@(\w+)\.(\w{3})
1-26  
import re


def Replace(filename, mail):
    with open(filename) as f:
        contexts = f.read()
        replace = re.sub(r'\w*@\w*\.\w{3}', mail, contexts)
        print(replace)


Replace('reddata.txt', '[email protected]')

1-27  
import re


def print_time(filename):
    with open(filename) as f:
        contexts = f.read()
        time = re.findall(r'\s(\w{3})\s(\d{2}).*?(\d{4})', contexts)
        for t in time:
            print(', '.join(t))


print_time('reddata.txt')

電話番号の取り扱い
1-28    (\d{3}-)?\d{3}-\d{3}
1-29    (\()?(\d{3})?(?(1)\) |-?)d{3}-d{3}単純化:((((d{3}-)|((d{3}))))?\d{3}-\d{3}
正規表現アプリケーション
1-30、1-31、1-32の深い問題は、知識が限られており、しばらくこれらの問題を解決することはできません.