Pythonコアプログラミング練習問題の正則表現

4030 ワード

1.次の文字列を識別します.「bat」、「bit」、「but」、「hat」、「hit」または「hut」です.
[bh][aiu]t

2.単一のスペースで分割された任意の単語のペア、すなわち姓と名を一致させる.
[a-zA-Z]+\s[a-zA-Z]+

3.姓の頭文字など、単一のカンマと単一の空白文字で区切られた任意の単語と単一のアルファベットを一致させる
[a-zA-Z]+,\s[a-zA-Z]

4.すべての有効なPython識別子セットを一致させる
[a-zA-Z]\w+

5.米国が受け取った住所フォーマットに基づいて、街の住所を一致させる.米国の受信アドレスには、1180 Bordeaux Driveというフォーマットが使用されています.3120 De la Cruz Boulevardのような多単語の街名をサポートするために、正規表現を十分に柔軟にします.
\d+\s([a-zA-Z]+\s*)+

6.「www」で始まり、「.com」で終わる簡単なWebドメイン名を一致させる:例えば、www://www.yahoo.com.
^www[^\s]+com$

7.Pythonの整数を表すすべての文字列セットを一致させる
[-+]?\d+

8.Python長の整数を表すすべての文字列セットを一致させる
[-+]?\d+[lL]

9.Python浮動小数点数を表すすべての文字列セットを一致させる
\d+\.\d*

10.Pythonの複数を表すことができるすべての文字列セットを表す
\d*(-\d+j)?

11.有効な電子メールを表すことができるすべてのセットを一致させる
\w+@[\w\.]+.com

12.有効なURLを表すことができるすべての集合(URL)を一致させる
http://[\w\.]+\.(com|cn)

13.文字列から実際のタイプ名を抽出できる正規表現を作成します.関数は文字列に対してintを返します
patt = r""
data = type(1)
m = re.search(patt,data)
if m:
        print(m.group(1))

14.処理日標準カレンダの残り3ヶ月の数値を表す正規表現が一般的です.
1[0-2]

15.クレジットカード番号の取り扱い
\d{4}(-\d{6}-\d{5}|(-\d{4}){3})

16.gendata.py更新コードは、データがredataに直接出力される.画面ではなくtxt
from random import randrange, choice
from string import ascii_lowercase as lc
from time import ctime

tlds = ('com', 'edu', 'net', 'org', 'gov')

for i in range(randrange(5,11)):
    dtint = randrange(10**10)
    dtstr = ctime(dtint)
    llen = randrange(4, 8)
    c = []
    for j in range(llen):
        c.append(choice(lc))
    login = ''.join(c)
    dlen = randrange(llen, 13)
    d = []
    for j in range(dlen):
        d.append(choice(lc))
    dom = ''.join(d)
    with open('redata.txt','a') as f:
        line = '%s::%s@%s.%s::%d-%d-%d' %(dtstr, login, dom, choice(tlds), dtint, llen, dlen)
        f.writelines(line+'
')

17.redataを判断する.txtの週ごとの出現回数
import re

days = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']
days_count = {}
with open('redata.txt','r') as f:
    patt = r'\w{3}'
    for line in f:
        m = re.match(patt,line)
        day = m.group()
        if day not in days:
            continue
        if day not in days_count:
            days_count[day] = 1
        else:
            days_count[day] += 1
    print(days_count)

18.抽出
  • 各行の完全なタイムスタンプ
  • を抽出する
  • 各行の完全なEメール
  • を抽出
  • は、タイムスタンプの月
  • のみを抽出します.
  • タイムスタンプの年
  • のみを抽出
  • タイムスタンプのみ抽出時
  • Eメールアドレスからのみログイン名とドメイン名を抽出する
  • 各ローのデータの電子メールアドレス
  • をあなたの電子メールアドレスで置き換えます.
    import re
    def find(line):
        patt = r'(\w+)\s(\w+)\s+(\d+)\s(\d+:\d+:\d+)\s(\d+)::(\w+@\w+\.\w+)::(\d+-\d+-\d+)'
        m = re.match(patt,line)
        return m
    
    def find_email(email):
        patt = r'(\w+)@(\w+)\.(\w+)'
        m = re.match(patt,email)
        return m
    
    with open('redata.txt','r') as f:
        for line in f:
            m = find(line)
            # 
            year = m.group(5)
            # 
            month = m.group(2)
            # 
            day = m.group(3)
            #  
            time = m.group(4)
            #  
            week = m.group(1)
            #   
            timestamp = year+' '+month+' '+day+' '+time+' '+week
            #  
            print(timestamp)
            email = m.group(6)
            m = find_email(email)
            name = m.group(1)
            main_host = m.group(2)
            second_host = m.group(3)
            print(name,main_host,second_host)
    

    19.符号は、正規表現を使用して800-555-1212、555-1212、および(800)555-1212に一致する
    ((\d+-)|(\(\d+\)\s))?\d+-\d+