0基礎0元學習Python-第二天

目錄

複習第一天的內容

第二題

第三題

總結


複習第一天的內容

李雷第一天寫了第一個Python程序,用來轉換字符。

我們來複習一下這個程序:

intab = "abcdefghijklmnopkrstuvwxyz"
outab = "cdefghijklmnopkrstuvwxyzab"
trantab = str.maketrans(intab, outab)
 
str = "g fmnc" 
print(str.translate(trantab))

 

這個程序利用maketrans函數,通過intab和outab定義了轉換規則,就是a對應c,b對應d,以此內推。

我們現在來看http://www.pythonchallenge.com/的第二題

李雷用了1個多小時在網上搜索瞭如何在本地安裝一個Python環境

 

第二題

地址:http://www.pythonchallenge.com/pc/def/ocr.html

根據提示,需要查看源代碼,然後源代碼裏給了新的提示,如圖:

圖1

提示是在下面的數據中,找尋最少的字母。這個數據比較大,李雷把數據複製了下來,保存成了level2.txt。然後2個小時過去了,李雷反覆調試程序,讓這個程序能讀入文本數據,並且在這些文本數據裏找到少量的字母,最後程序如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 通過文件讀取題目給的數據,因爲數據是行數據,這裏把數據去掉了對於的空格
s = ''
# 打開文件,把數據存入s變量,使用with打開,可以自動處理釋放資源
with open('level2.txt') as file_:
    s = ''.join(line.rstrip() for line in file_)

# 我們需要計算數據裏單個字符出現的字數,所以使用一個字典來統計,這個字典變量是count_map
# 裏面每一個key代表出現過的字符,key對應的value對應這個字符出現的次數
# t變量定義爲一個數組,這樣我們可以有序的存放出現過的字母字符
count_map = {}
t = []

# 先來一個循環,循環每一次取出s變量裏的一個字符進行處理
for i in range(len(s)):
  # 如果字典裏已經有了這個字符,那麼就加1
  cChar = s[i]
  if count_map.get(cChar):
    count_map[cChar] += 1
  else:
    # 如果字典裏沒有這個字符,那麼就在字典裏添加這個字符,並把次數記爲1
    count_map[cChar] = 1
  # 如果當前這個字符屬於字母,就記錄在數組裏
  if ord(cChar) > 96 and ord(cChar) < 123:
    t.append(cChar)

# 輸出字典
print(count_map)
# 把數組裏每一項合併到一起輸出
print(''.join(c for c in t))

最後輸出了:equality

然後輸入http://www.pythonchallenge.com/pc/def/equality.html

來到了第三題,氣氛有點詭異。

第三題

題目地址:http://www.pythonchallenge.com/pc/def/equality.html,頁面裏照舊有一副圖片。

看題目,有一句英文說明:

One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.

英文不好,要看懂這個提示挺費勁的,李雷研究了很久這句話,並且在頁面源碼(瀏覽器裏單擊鼠標右鍵,選擇查看源代碼就能看到)中找到了一個很長的字符串。如果沒有理解錯的話,這個很長的字符串裏隱藏的每個小寫字母剛好被左右兩邊3個大寫字母包圍着。類似於這樣的情況:

AAAzBBB

李雷琢磨,用程序如何尋找呢?業界有一個查找字符串的統一辦法,叫正則表達式。它是計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。

李雷仔細學習了一下關於Python的正則表達式如何使用,學習的內容在這個網頁裏:https://www.runoob.com/python/python-reg-expressions.html

總結下來,就是先要有一個模式字符串,這個字符定義了匹配規則,而且這個字符串有一些方便匹配的元字符可以使用。然後利用Python提供的一些函數,在目標字符串裏進行匹配,並返回匹配結果。爲了精確匹配上面提到的AAAzBBB模式,李雷反覆在一個在線正則表達式測試網站反覆嘗試,終於拼湊出了這個正則模式字符串:

[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]

通過[A-Z]定義大寫字母,[a-z]定義小寫字母,{3}代表前面的字符匹配出現3次,在這裏指3個大寫字母。中間用()包起來可以在輸出結果的地方單獨輸出。

李雷把這道題給的字符串保存到本地,然後結合上一題學會的文件讀取處理,最後的代碼如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import re
s = ''
# 打開文件,把數據存入s變量,使用with打開,可以自動處理釋放資源
with open('level3.txt') as file_:
  s = ''.join(line.rstrip() for line in file_ )

# 通過正則表達式,獲得匹配好的數據,re.M表示多行匹配,這裏其實不是必須,因爲上一步已經把字符串處理成了一行
searchAll = re.finditer( r'[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]', s, re.M)

# 這個變量用來存放所有的匹配出來的小寫字母
letter = ''

# 因爲使用了re.finditer函數,需要利用循環來讀取匹配到的結果,每一次循環獲得匹配到的一個結果
for match in searchAll:
   print(match.group())
   print(match.group(1))
   letter = letter + match.group(1) # 因爲在模式字符串中寫了(),所以使用group(1)能獲得括號裏的內容

print letter

最後輸出的結果是linkedlist。

李雷迫不及待的輸入http://www.pythonchallenge.com/pc/def/linkedlist.html。頁面提示linkedlist.php

輸入http://www.pythonchallenge.com/pc/def/linkedlist.php。頁面正式來到了第四題。

 

頁面裏沒有任何提示,但是圖片可以點擊,點擊後的頁面是:http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345

頁面顯示and the next nothing is 44827。然後訪問http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=44827

頁面顯示and the next nothing is 45439,接着訪問http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=45439

頁面顯示Your hands are getting tired and the next nothing is 94485,接着訪問http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=94485

頁面顯示and the next nothing is 72198,接着訪問http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=72198

頁面顯示and the next nothing is 80992,接着訪問http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=80992

......

李雷感覺進入循環了,這樣手動輸入下去,什麼時候纔是個頭呀,能寫一個程序。幫我自動完成上面的操作多好,但是程序怎麼知道如何停下來呢?按照推理,如果返回的內容不是以and the next nothing is 開口的,就應該停下來看看。於是李雷開始學習Python如何模擬訪問網頁,並操作裏面的數據。

 

總結

今天李雷,解決了2道題。

學會了使用Python讀取文件,獲得文件裏的數據。

學會了通過Python使用正則表達式匹配字符串。正則表達式使得查詢變得強大而且簡單。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章