[Python基礎]檢查及過濾字串中的特殊字符

2024/01/30閱讀時間約 5 分鐘

在實務上,條碼槍傳送的資訊可能包含不可見字符控制字符。這可能是因為條碼槍在傳送條碼數據時使用了一些特殊字符,這些字符在可見字符集合之外,例如 \x06 就是 ASCII 中的 "ACK" 控制字符。

本文將探討,如何查詢處理這些特殊字符

在 Python 中,不可見字符通常指的是 ASCII 字符集中的控制字符和一些特殊字符,它們在顯示時不會產生可見的印刷效果。

以下是一些常見的不可見字符

控制字符:
\n換行符 (Line Feed) → 在字串中表示換行,移動到下一行的開始位置。
\r回車符 (Carriage Return) → 移動光標到當前行的開始位置,用於覆蓋該行的內容。
\t水平制表符 (Tab) → 插入水平制表,通常用於在字串中插入空格,以達到對齊的效果。
\b退格符 (Backspace) → 將光標向左移動一格,可用於消除前一字符。
\f換頁符 (Form Feed) → 在某些情境中,表示換頁,用於在輸出中插入頁面分隔符。
\v垂直制表符 (Vertical Tab) → 插入垂直制表,用於在字串中插入空格,達到對齊的效果。
\a響鈴字符 (Bell) → 觸發響鈴聲或警告聲。在現代終端中,通常不會實際發出聲音,而是視為通知或警告。

特殊空白字符:
\s空格符 (Space) → 表示一個普通的空格。
\f換頁符 (Form Feed) → 類似於控制字符中的 \f,表示換頁。
\v垂直制表符 (Vertical Tab) → 類似於控制字符中的 \v,表示垂直制表。
\u200B零寬空格 (Zero Width Space) → 表示一個不佔據實際寬度的空格,通常在排版和格式化文本時使用。
\u00A0不中斷空白 (Non-Breaking Space) → 表示一個不會被自動斷行的空格,常用於確保連續的文字不會被分開。

其他控制字符:
\x00 到 \x1FASCII 控制字符的範圍,包括空白字符、退格、換行等。
\x7F刪除字符


查詢不可見字符

repr()

可以將字符串轉換包含可見和不可見為字符的表示形式。

print(repr(your_string))

範例說明

假設讀取到的條碼槍含有\x06字符,假設條碼資訊為DEF,若未處理可能會造成傳送錯誤的資料\x06DEF,所以先用repr()檢查是否包含不可見字符。

# 假設這是從條碼槍讀取的字符串
barcode_data = "ABC\x06DEF"

# 使用 repr() 函數來查看字符串的 Python 表示形式
repr_of_barcode = repr(barcode_data)

# 打印結果'
print(f'原始字串:{barcode_data}')
print(f'處理過後: {repr_of_barcode}')
repr()範例

repr()範例


過濾不可見字符:

使用正則表達式re.sub,過濾掉字串中的不可見字符​

re.sub 是 Python 中 re 模組中的一個函數

re.sub(pattern, repl, string, count=0, flags=0)

pattern: 要匹配的正則表達式。
repl: 用於替換匹配字串的字符串。
string: 要進行替換的原始字符串。
count (可選): 替換的最大次數,默認為 0(替換所有匹配)。
flags (可選): 正則表達式的標誌,用於修改匹配的行為

範例說明

正則化後,就將控制字符\x06移除了,顯示正常字串。

repr_of_barcode = repr(barcode_data)只是將可見與不可見字符,一起轉換成字串顯示,若將repr_of_barcode丟進去該範例的正則化表示,則不會過濾\x06喔,因為已經都轉成字串了。

import re

# 假設這是從條碼槍讀取的字符串
barcode_data = "ABC\x06DEF"

# 使用 repr() 函數來查看字符串的 Python 表示形式
repr_of_barcode = repr(barcode_data)

#使用正則化 保留 ASCII 字符範圍內的可見字符
re_barcode = re.sub(r'[^\x20-\x7E]', '', barcode_data)
# 打印結果'
print(f'原始字串:{barcode_data}')
print(f'repr()處理過後: {repr_of_barcode}')
print(f'正則化: {re_barcode}')
正則表達式

正則表達式

隨手紀錄,遇到的狀況及整理後的心得




49會員
88內容數
Python程式設計師,不是在學習就是在學習的路上
留言0
查看全部
發表第一個留言支持創作者!