2023年12月31日 星期日

使用MakeCode來開發micro:bit和WS2812的控制程式




參考資料:Micro:bit Neopixel Introductio

記得選擇Extensions,安裝下列套件。


樍木程式如下:


Python程式如下: 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def on_button_pressed_a():
    global go
    go = 0
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_button_pressed_b():
    global go
    go = 1
input.on_button_pressed(Button.B, on_button_pressed_b)

go = 0
strip = neopixel.create(DigitalPin.P0, 16, NeoPixelMode.RGB)
strip.clear()
strip.show()
basic.show_icon(IconNames.HEART)

def on_every_interval():
    basic.show_string("Happy New Year!")
loops.every_interval(10000, on_every_interval)

def on_forever():
    if go == 1:
        for indeks in range(17):
            strip.clear()
            strip.set_pixel_color(indeks,
                neopixel.rgb(randint(0, 255), randint(0, 255), randint(0, 255)))
            strip.show()
            basic.pause(10)
basic.forever(on_forever)

利用電子名片(vCard)格式使用Python產生QR Code

vCard:https://zh.wikipedia.org/zh-tw/VCard

以下程式是利用ChaGPT產生:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import qrcode
import vobject
import matplotlib.pyplot as plt

def generate_qr_code(vcard_data, output_filename="qrcode.png"):
    # 創建一個vCard對象
    vcard = vobject.readOne(vcard_data)

    # 創建一個QR Code實例
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )

    # 將vCard數據添加到QR Code中
    qr.add_data(vcard.serialize())
    qr.make(fit=True)

    # 從QR Code實例創建一個圖片
    img = qr.make_image(fill_color="black", back_color="white")

    # 將圖片保存為文件
    img.save(output_filename)

    # 顯示QR Code
    plt.imshow(img)
    plt.axis('off')
    plt.show()

if __name__ == "__main__":
    # 範例vCard數據
    sample_vcard = """BEGIN:VCARD
VERSION:3.0
FN:John Doe
ORG:Example Inc.
TEL:123456789
EMAIL:john.doe@example.com
END:VCARD
"""

    # 生成包含範例vCard數據的QR Code並顯示
    generate_qr_code(sample_vcard)
    print("成功生成並顯示QR Code。")

執行結果:

成功生成並顯示QR Code。

2023年12月24日 星期日

使用cryptography套件來進行數位簽章

 

程式設計說明:

利用 Python 程式碼使用 cryptography 函式庫來實現了數位簽章(Digital Signature)的功能。首先,先成金鑰對(generate_key_pair),再依照上圖來簽署訊息(sign_message)和驗證簽章(verify_signature),來實現三個函式,說明如下:

1.生成金鑰對(generate_key_pair):

  • 使用 rsa.generate_private_key 函數生成一對私鑰(private_key)和公鑰(public_key)。
  • 公鑰通常用於驗證數位簽章,私鑰用於創建數位簽章。
2.簽署訊息(sign_message):
  • 使用私鑰對給定的訊息(message)進行數位簽章。
  • 簽章過程使用了 PSS padding 和 SHA-256 hash 函數。
3.驗證簽章(verify_signature):
  • 使用公鑰對簽章進行驗證,確保簽章是由對應的私鑰創建的。
  • 如果驗證成功,返回 True,否則捕捉例外並輸出錯誤訊息,然後返回 False。

程式碼如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding

def generate_key_pair():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )
    public_key = private_key.public_key()
    return private_key, public_key

def sign_message(private_key, message):
    signature = private_key.sign(
        message.encode('utf-8'),
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    return signature

def verify_signature(public_key, message, signature):
    try:
        public_key.verify(
            signature,
            message.encode('utf-8'),
            padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH
            ),
            hashes.SHA256()
        )
        return True
    except Exception as e:
        print(f"驗證失敗: {e}")
        return False

# Example usage:
private_key, public_key = generate_key_pair()
message_to_sign = "虎尾鎮,舊稱「大崙腳」,位於臺灣雲林縣中心,是一個因糖廠而興起的城鎮。"

signature = sign_message(private_key, message_to_sign)
print(f"數位簽章: {signature.hex()}")

if verify_signature(public_key, message_to_sign, signature):
    print("有效的數位簽章")
else:
    print("無效的數位簽章")

第一次執行結果:
數位簽章: 7006f8b687e8a0b93915822731f5bd74833a1bfc1b4bb610dbee5c6eb5ed5b99059ec9a7a6727b6dfffeb7f772079ada05f9c804abc31b13834429c1b4cc5b82719f08f6665a05211205f5f74365e0eb19f543c02139d09417fe1a7befd248face6ae8e9173d5b6a9ac5347ca0fad9fce0f5df3e7949811c786e0ff1ce389074f2e15bdf44efd46a3e420079312bad276a0322a95a538518828e9c6fa6f2cb392776ad6768524628721f311a4f7f41a8cb6019c6ff7668fe4fc96c2d64a24f43891144a96bf68e9373a26813beea80943b2a9c3bc69f966689e9c8ef93d0dfb5115b93308621b8024c9e591132fcc59cfa2dffbd6090f0f65027ab61a53e6564
有效的數位簽章

第二次執行結果:
數位簽章: 64c1c967c1f3e2866d3e4fb724e0fb74401e623be0c0f14d07ae6569edf09ca509613aa051ef5e467b6548fa6084f61fa067812832f1eabb750a1454e082cb9c03886f4e68958bdba785d3dac4a2405b3bf79e47f769c6d5b1a4dca782a280ec81337ce30b7104230058c7b61f97f2793a6b1ef63b685a59c355f05b1a9dd822094685c8445269540063120ca84356017ef3bdcf74fc4176e7704a794bb508764eb09cea3f491daac4f8adb3b958a10c279c056331147d9d0c712003bdb0a2366c487576e2916fc3fe111086c9630fbcad207a04b4f2773234248cccbbf7b191d2928fcb7db38c82f8611373b5c7843681d955a290e0784e7213ccf580bd6fae
有效的數位簽章

以上兩次執行會發現數位簽章都不同,但執行結果是一樣的,都是有效的數位簽章。

若在第47行插入下列程式:
message_to_sign = "虎尾鎮是一個因糖廠而興起的城鎮。"

修改後的程式碼如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding

def generate_key_pair():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )
    public_key = private_key.public_key()
    return private_key, public_key

def sign_message(private_key, message):
    signature = private_key.sign(
        message.encode('utf-8'),
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    return signature

def verify_signature(public_key, message, signature):
    try:
        public_key.verify(
            signature,
            message.encode('utf-8'),
            padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH
            ),
            hashes.SHA256()
        )
        return True
    except Exception as e:
        print(f"驗證失敗: {e}")
        return False

# Example usage:
private_key, public_key = generate_key_pair()
message_to_sign = "虎尾鎮,舊稱「大崙腳」,位於臺灣雲林縣中心,是一個因糖廠而興起的城鎮。"

signature = sign_message(private_key, message_to_sign)
print(f"數位簽章: {signature.hex()}")
message_to_sign = "虎尾鎮是一個因糖廠而興起的城鎮。"
if verify_signature(public_key, message_to_sign, signature):
    print("有效的數位簽章")
else:
    print("無效的數位簽章")

執行結果:
數位簽章: 2498811122ad6bd65cfd4fcaee18c30cc75ee3007571ab8c17438cbc8b4ef1c347df20866c0e77ced3d63d19bb5a2dc87362ea76a6050429b19538ec5f416c6ea058ffc5c003e95f0aa06c15a29869190e438a72a216b226470bd5652bdc2a9949a6b51159a574eb9cfcddb77fa11617d11dcc9e55c3711088079da8bb06d80a658dc041bde272e2a1bd96a0eb80561410701aed2f22d93e68ea71a390e391093f43d9a8952005e526c174c406d9b5624298d105854282d9cf116d246075cc0b748b5f75ec7f0d860757ae16cf860c1791cef2ba3fab6a52bf6ec45c171d7cd38f5360dba55c0d23ed3e837ccc639bec923f207cc71ba9f42fbff6905fe714d7
驗證失敗: 
無效的數位簽章

以上範例告訴我們若文件內容被修改,則驗證將失敗。

2023年12月23日 星期六

使用pymysql套件來操作MySQL資料庫

 參考資料如下:

  1. 黃建庭,"Python程式設計從入門到進階應用",全華,第13章,第13-16頁。
  2. [2020鐵人賽Day17]糊裡糊塗Python就上手-MySQL操作探險歷程(上),https://ithelp.ithome.com.tw/articles/10246378
  3. [2020鐵人賽Day18]糊裡糊塗Python就上手-MySQL操作探險歷程(下),https://ithelp.ithome.com.tw/articles/10246379

本篇文章是將參考資料的第一篇文章的範例,用參考資料第二、三篇的套件改寫。

程式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pymysql

# 連接到 MySQL 資料庫
connect_db = pymysql.connect(host='localhost', port=3306, user='root', passwd='', charset='utf8')

# 使用 with 來確保資源的正確釋放
with connect_db.cursor() as cursor:
    # 建立一個名為 'school' 的資料庫
    cursor.execute('CREATE DATABASE school')

    # 選擇 'school' 資料庫
    cursor.execute('USE school')

    # 建立一個名為 'stu' 的表格
    sql = """CREATE TABLE stu (
        stuid INTEGER PRIMARY KEY,
        name VARCHAR(50) NOT NULL,
        pid VARCHAR(20) NOT NULL,
        phone VARCHAR(20) NOT NULL )"""
    cursor.execute(sql)

    # 插入一條記錄到 'stu' 表格
    sql = "INSERT INTO stu VALUES (104001, 'Claire', 'B342222', '1245667')"
    cursor.execute(sql)

    # 查詢 'stu' 表格的所有記錄
    result = cursor.execute("SELECT * FROM stu")
    rows = cursor.fetchall()
    print(rows)

    # 刪除 'stu' 表格
    cursor.execute('DROP TABLE stu')

    # 刪除 'school' 資料庫
    cursor.execute('DROP DATABASE school')

執行結果:
((104001, 'Claire', 'B342222', '1245667'),)

2023年12月3日 星期日

用Python與正規表示式來分析和擷取字串

 文字內容摘自維基百科-國立虎尾科技大學

範例一、搜尋完整中文字詞

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立虎尾科技大學',s)
print(ans)

執行結果:
['國立虎尾科技大學']

範例二、搜尋其中一個符合的中文字詞

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立|虎尾|科技|大學',s)
print(ans)

執行結果:
['國立', '虎尾', '科技', '大學', '虎尾', '國立', '大學', '虎尾', '國立', '科技', '大學', '國立']

範例三、可以用中括號來搜尋其中一個符合的中文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]',s)
print(ans)

執行結果:
['國', '立', '虎', '尾', '科', '技', '大', '學', '虎', '科', '虎', '科', '大', '虎', '尾', '科', '大', '國', '立', '大', '學', '虎', '尾', '國', '立', '科', '技', '大', '學', '大', '科', '學', '立', '科', '學', '立', '國', '立', '科', '學']

範例四、配對零個或多個字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]*',s)
print(ans)

執行結果:
['國立虎尾科技大學', '', '', '', '', '虎科', '', '虎科大', '', '虎尾科大', '', '', '', '國立', '', '', '', '', '大學', '', '', '', '', '', '', '', '', '虎尾', '', '', '', '', '國立科技大學', '', '', '', '', '', '', '', '', '', '', '', '', '', '大', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '科學', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '立', '', '', '', '', '', '科學', '', '', '', '', '', '', '', '', '', '立', '', '', '', '', '', '', '', '', '', '', '', '', '國立', '', '', '', '', '', '科學', '', '', '', '']

範例五、配對零個或多個字,越少越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]*?',s)
print(ans)

執行結果:
['', '國', '', '立', '', '虎', '', '尾', '', '科', '', '技', '', '大', '', '學', '', '', '', '', '', '虎', '', '科', '', '', '虎', '', '科', '', '大', '', '', '虎', '', '尾', '', '科', '', '大', '', '', '', '', '國', '', '立', '', '', '', '', '', '大', '', '學', '', '', '', '', '', '', '', '', '', '虎', '', '尾', '', '', '', '', '', '國', '', '立', '', '科', '', '技', '', '大', '', '學', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '大', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '科', '', '學', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '立', '', '', '', '', '', '', '科', '', '學', '', '', '', '', '', '', '', '', '', '', '立', '', '', '', '', '', '', '', '', '', '', '', '', '', '國', '', '立', '', '', '', '', '', '', '科', '', '學', '', '', '', '']

範例六、配對1個或多個字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]+',s)
print(ans)

執行結果:
['國立虎尾科技大學', '虎科', '虎科大', '虎尾科大', '國立', '大學', '虎尾', '國立科技大學', '大', '科學', '立', '科學', '立', '國立', '科學']

範例七、配對1個或多個字,越少越好
1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]+?',s)
print(ans)

執行結果:
['國', '立', '虎', '尾', '科', '技', '大', '學', '虎', '科', '虎', '科', '大', '虎', '尾', '科', '大', '國', '立', '大', '學', '虎', '尾', '國', '立', '科', '技', '大', '學', '大', '科', '學', '立', '科', '學', '立', '國', '立', '科', '學']

範例八、判斷開頭的文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('^國立虎尾科技大學',s)
print(ans)

執行結果:
['國立虎尾科技大學']

範例九、列出不是要找的字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[^國立虎尾科技大學]',s)
print(ans)

執行結果:
[',', ' ', '簡', '稱', '、', '、', ',', '別', '稱', '福', '爾', '摩', '沙', ',', '位', '於', '台', '灣', '雲', '林', '縣', '鎮', '之', '一', '所', '。', '前', '身', '為', '雲', '林', '工', '專', ',', '為', '昔', '日', '三', '工', '專', '之', '一', '。', '1', '9', '8', '0', '年', '5', '月', '即', '開', '始', '籌', '設', '工', '業', '專', '校', ',', '到', '了', '7', '月', '正', '式', '創', '校', ',', '校', '名', '為', '「', '臺', '灣', '省', '雲', '林', '工', '業', '專', '校', '」', '。', '1', '9', '8', '1', '年', '省', '雲', '林', '工', '專', '改', '名', '配', '合', '更', '名', '為', '「', '雲', '林', '工', '業', '專', '校', '」', '。']

範例十、{n}連續配對n個字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]{4}',s)
print(ans)

執行結果:
['國立虎尾', '科技大學', '虎尾科大', '國立科技']

範例十一、{m,n}連續配對至少m個字到n個字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]{3,8}',s)
print(ans)

執行結果:
['國立虎尾科技大學', '虎科大', '虎尾科大', '國立科技大學']

範例十一、{m,n}連續配對至少m個字到n個字,越少越好
1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('[國立虎尾科技大學]{3,8}?',s)
print(ans)

執行結果:
['國立虎', '尾科技', '虎科大', '虎尾科', '國立科', '技大學']

範例十二、配對左邊且有右邊文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立(?=虎尾)',s)
print(ans)

執行結果:
['國立']

範例十二、配對左邊且有右邊文字並顯示出來

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立(?=虎尾)..',s)
print(ans)

執行結果:
['國立虎尾']

範例十二、配對左邊且沒有右邊文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('國立(?!虎尾)..',s)
print(ans)

執行結果:
['國立福爾', '國立科技', '國立雲林']

範例十二、配對左邊且有右邊文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('..(?<=雲林)工業',s)
print(ans)

執行結果:
['雲林工業', '雲林工業']

範例十三、配對左邊且沒有右邊文字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('..(?<!雲林)工業',s)
print(ans)

執行結果:
['籌設工業']

範例十四、匹配數字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\d',s)
print(ans)

執行結果:
['1', '9', '8', '0', '5', '7', '1', '9', '8', '1']

範例十五、匹配數字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\d+',s)
print(ans)

執行結果:
['1980', '5', '7', '1981']

範例十五、匹配非數字,越多越好

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\D+',s)
print(ans)

執行結果:
['國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,位於台灣雲林縣虎尾鎮之一所國立科技大學。前身為雲林工專,為昔日三大工專之一。', '年', '月即開始籌設工業專科學校,到了', '月正式創校,校名為「臺灣省立雲林工業專科學校」。', '年省立雲林工專改名配合更名為「國立雲林工業專科學校」。']

範例十六、匹配一個空白字,並顯示後面2個字

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\s..',s)
print(ans)

執行結果:
[' 簡稱']

範例十六、匹配非空白字,並顯示所有的文字
1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\S+',s)
print(ans)

執行結果:
['國立虎尾科技大學,', '簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,位於台灣雲林縣虎尾鎮之一所國立科技大學。前身為雲林工專,為昔日三大工專之一。1980年5月即開始籌設工業專科學校,到了7月正式創校,校名為「臺灣省立雲林工業專科學校」。1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。']

範例十七、匹配一個中英文、數字或底線字元

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\w',s)
print(ans)

執行結果:
['國', '立', '虎', '尾', '科', '技', '大', '學', '簡', '稱', '虎', '科', '虎', '科', '大', '虎', '尾', '科', '大', '別', '稱', '國', '立', '福', '爾', '摩', '沙', '大', '學', '位', '於', '台', '灣', '雲', '林', '縣', '虎', '尾', '鎮', '之', '一', '所', '國', '立', '科', '技', '大', '學', '前', '身', '為', '雲', '林', '工', '專', '為', '昔', '日', '三', '大', '工', '專', '之', '一', '1', '9', '8', '0', '年', '5', '月', '即', '開', '始', '籌', '設', '工', '業', '專', '科', '學', '校', '到', '了', '7', '月', '正', '式', '創', '校', '校', '名', '為', '臺', '灣', '省', '立', '雲', '林', '工', '業', '專', '科', '學', '校', '1', '9', '8', '1', '年', '省', '立', '雲', '林', '工', '專', '改', '名', '配', '合', '更', '名', '為', '國', '立', '雲', '林', '工', '業', '專', '科', '學', '校']

範例十六、匹配一個中英文、數字或底線字元,可是是標點符號

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall('\W',s)
print(ans)

執行結果:
[',', ' ', '、', '、', ',', ',', '。', ',', '。', ',', ',', '「', '」', '。', '「', '」', '。']

範例十七、匹配\w和\W的邊界

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall(r'\b國......',s)
print(ans)

執行結果:
['國立虎尾科技大', '國立雲林工業專']

範例十八、匹配不在\w和\W的邊界

1
2
3
4
5
6
7
8
9
import re
s='國立虎尾科技大學, 簡稱虎科、虎科大、虎尾科大,別稱國立福爾摩沙大學,\
位於台灣雲林縣虎尾鎮之一所國立科技大學。\
前身為雲林工專,為昔日三大工專之一。\
1980年5月即開始籌設工業專科學校,到了7月正式創校,\
校名為「臺灣省立雲林工業專科學校」。\
1981年省立雲林工專改名配合更名為「國立雲林工業專科學校」。'
ans=re.findall(r'\B國.{6}',s)
print(ans)

執行結果:
['國立福爾摩沙大', '國立科技大學。']