Python 修改剪貼板 方法 (一)win32clipboard 庫


import win32clipboard
import re
import time


def clipboard_get():
    """獲取剪貼板數據"""
    win32clipboard.OpenClipboard()
    data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
    win32clipboard.CloseClipboard()
    return data


def clipboard_set(data):
    """設置剪貼板數據"""
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(win32clipboard.CF_UNICODETEXT, data)
    win32clipboard.CloseClipboard()


# 初始化替換字符列表,相比於正則使用replace函數進行單字符替換更快
char_list = [('', '('),
             ('', ')'),
             ('', '"'),
             ('', '"'),
             ('', '\''),
             ('', '\''),
             ('print ', 'print '),
             ('版權聲明:本文為CSDN', '版權聲明:本文為CSDN'),
             ]

# 預編譯正則替換匹配表達式
# 匹配python2格式的 print函數文本
sub_print = re.compile(r'\bprint\s+(.+)')
# 匹配csdn復制自帶的版權聲明后綴文本
sub_csdn = re.compile(r'—+\s+版權聲明:本文為CSDN.*\s+原文鏈接.*')


# 指定場景 sub替換函數:python2格式的 print函數 替換為python3格式
def sub_fn(s):
    return 'print(' + s.group(1).strip() + ')\r\n'


# 判斷如果沒有要替換的字符則返回None,有則執行替換操作,先進行字符列表replace,再執行reg.sub(sub_fn, txt)
def char_replace_reg_sub(txt):
    new_txt = txt

    # 對字符列表中字符 逐一判斷,如果字符在文本中 則replace替換,如果都不在 則return None,不用再進行替換操作
    i = 0
    for old_char, new_char in char_list:
        if old_char in new_txt:
            i += 1
            new_txt = new_txt.replace(old_char, new_char)
    if i == 0:
        return None

    print('-' * 150, '\n【After char replace】:', new_txt)
    # 對指定場景替換 使用正則re.sub
    new_txt = sub_print.sub(sub_fn, new_txt)
    new_txt = sub_csdn.sub('', new_txt)
    print('【After sub replace:】', new_txt)
    return new_txt


def main():
    """后台腳本:每隔0.2秒,讀取剪切板文本,檢查有無指定字符或字符串,如果有則執行替換"""
    # recent_txt 存放最近一次剪切板文本,初始化值只多執行一次paste函數讀取和替換
    recent_txt = clipboard_get()
    replaced_txt = char_replace_reg_sub(recent_txt)
    clipboard_set(recent_txt if replaced_txt is None else replaced_txt)

    while True:
        # txt 存放當前剪切板文本
        txt = clipboard_get()

        # 剪切板內容和上一次對比如有變動,再進行內容判斷,判斷后如果發現有指定字符在其中的話,再執行替換
        if txt != recent_txt:
            # print(f'txt:{txt}')
            new_txt = char_replace_reg_sub(txt)  # 沒查到要替換的子串,返回None

            if new_txt is not None:
                clipboard_set(new_txt)
                # 更新 recent_txt 為替換之后的文本,便於下次與 txt 剪切板文本對比,判斷內容有無更新
                recent_txt = new_txt

        # 檢測間隔(延遲0.2秒)
        time.sleep(0.2)


if __name__ == '__main__':
    main()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM