iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 29
0

今天要來看看一個大家應該不會太陌生,但對我來說每次只要一久不用就會忘掉的正規表示式 (Regular expression)。正規表示式在處理複雜規則的字串很有幫助。而在這四個語言又是如何去使用正規表示式的呢?就讓我們來看看吧!


Python

import re

my_list = []

n = int(input())

for i in range(n):
    data = str(input()).split(" ")
    name = data[0]
    email = data[1]

    if re.search(".+@gmail\.com$", email):
        my_list.append(name)

my_list.sort()

for name in my_list:
    print(name)
  • 在 Python 如果要使用 Regular expression,我們要 Import 的 Module 是 re (官方文件在這)。如上面的程式碼,我們輸入 <name> <email>,並且透過 re.search 這個 Function 來判斷我們得到的 email 是不是最後屬於 Gmail,如果是的話才把名字給加入到 List my_list 裡頭。而這裡的關鍵在於 re.search 的第一個參數,也就是正規表示式的 Search pattern ".+@gmail\.com$"re.search 會看第二個參數,也就是字串,是否有此 Pattern 的存在,如果有的話就回傳一個 Match 的 object,裡面會包含結果的資訊。反之則回 None。現在我們看看 ".+@gmail\.com$". 代表任何字元,+ 代表一個以上,所以 .+ 代表一個以上的任意字元,例如 abcde1-2-3 等等。而 @gmail\.com$ 就是在一個以上的任意字元後有 @gmail.com 的字串,這裡的 \. 是因為 . 本身有它的含義,但我們希望是真的 Match 到 . 所以要跳脫。最後的 $ 表示 @gmail.com 要是字串的最後才行。
  • 更多關於 re 中函數們的使用,以及 Search pattern 的寫法可以參考這裡 囉!

Golang

match, err := regexp.MatchString("i([a-z]+)man", "ironman")  
fmt.Println(match)  

r, _ := regexp.Compile("i([a-z]+)man")
fmt.Println(r.MatchString("ironman"))

  • 在 Golang 已經有內建專門做 Regular expression 的 Package regexp,以第一行為例 regexp.MatchString("i([a-z]+)man", "ironman") 做的事情是看第二個參數的值 ironman 是不是符合第一個參數 i([a-z]+)man 這個 Pattern。其中 ([a-z]+) 表示小寫的 a 到 z 之中的字母,而且是連續一個以上。Return 的第一個值 match 是個 Boolean,有符合就是 True,反之則為 False。
  • regexp.Compile("i([a-z]+)man") 是先把規則給 Compile 成一個 Regexp 的 Struct (參考),之後就可以直接使用這個 Struct 的方法,包含 MatchString

上一篇
[Day 27] 自己的程式自己測
下一篇
[Day 29] 一起做事效率高
系列文
30 天把自己榨好榨滿的四週四語言大挑戰!30

尚未有邦友留言

立即登入留言