在 Shell 中轉換 Python 正規表示式
sed
命令來轉換Python正規表示式。
sed
是一個流編輯器,可以用來對文字進行替換、刪除等操作。下面是一個示例,演示如何在Shell中將Python正規表示式轉換為適用於
sed
的格式,也是比較穩妥的一種方式。
如上面所謂,假設我們有一個Python正規表示式
^\d{3}-\d{3}-\d{4}$
sed
命令的格式。
1、問題背景
一位使用者想要編寫一個 AppleScript 播放列表生成器,其中一部分工作是讀取 iTunes 庫的 XML 檔案,以便獲取使用者庫中所有流派的列表。Python 實現如下:
#!/usr/bin/env python
# 指令碼用於獲取 iTunes 中的所有流派
import re, sys, sets
## 從網際網路上找到的程式碼,用於處理流派名稱中的 HTML 實體
def unescape( text):
def fixup( m):
text = m. group( 0)
if text[: 2] == "&#":
# 字元引用
try:
if text[: 3] == "&#x":
return unichr( int( text[ 3: - 1], 16))
else:
return unichr( int( text[ 2: - 1]))
except ValueError:
pass
else:
# 命名實體
try:
text = unichr( htmlentitydefs. name2codepoint[ text[ 1: - 1]])
except KeyError:
pass
return text # 保留原樣
return re. sub( "&#?\w+;", fixup, text)
# 使用正規表示式比遍歷整個 XML 文件並聚合流派可能更快
try:
xml_path = "/Users/%s/Music/iTunes/iTunes Music Library.xml" % sys. argv[ 1]
except:
print '\tUsage: python ' + sys. argv[ 0] + ' <your OSX username>'
raise SystemExit
pattern = "<key>Genre</key><string>([^<]+)</string>"
try:
xml = file( xml_path, 'r'). read()
except:
print '\tUnable to load your iTunes Library XML file'
raise SystemExit
matches = re. findall( pattern, xml)
uniques = map( unescape, list( sets. Set( matches)))
## 需要將這些內容寫到某個地方,以便 AppleScript 可以讀取它們
sys. stdout. write( '|'. join( uniques))
raise SystemExit
問題是,使用者希望 AppleScript 是獨立的,不需要額外的檔案(他計劃將它提供給其他人)。而且,據他所知,AppleScript 本身不提供任何正規表示式功能。他可能會遍歷庫中的每個音軌以獲取所有流派,但這是一個非常耗時的過程,而且在構建播放列表時他已做了一次。因此,他正在尋找替代方案。
由於 AppleScript 允許他執行 shell 指令碼並捕獲結果,他想象他可以使用某種型別的 shell 命令來完成同樣的操作,比如 grep、perl,或其他命令。他的 *nix 命令列技能非常生疏,他正在尋找一些指導。
總之,他希望找到一種將以上 Python 程式碼轉換成可以直接從 shell 中呼叫並獲得類似結果的方法。
2、解決方案
-
為什麼你使用正規表示式解析 XML?為什麼不使用一個合適的 XML 庫?
-
Python 有一些很棒的實用工具,比如 ElementTree,它使遍歷 DOM 變得更加容易,並且它產生的是漂亮的、友好的物件,而不是未型別化的字串。
-
以下是一些使用 AppleScript 解析 XML 的方法:
-
AppleScript XML Parser(據稱自 Tiger 開始可用)
-
可以與 AppleScript 一起使用的 XML 工具
-
-
請記住,就像 AppleScript 可以連線到 iTunes 一樣,它也可以連線到其他已安裝的實用工具,比如這些。
-
最後,為什麼不完全用 Python 編寫整個指令碼呢?因為它具有更好的開發工具用於除錯,並且執行速度更快。如果使用者執行的是 Leopard,那麼他預裝了 Python 2.5.1。
透過上面的程式碼示例,我們可以將Python正規表示式轉換為適用於
sed
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3008794/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Shell正規表示式
- shell常用正規表示式
- shell指令碼正規表示式指令碼
- shell高階-----正規表示式
- python正規表示式Python
- Python 正規表示式Python
- Python——正規表示式Python
- Python:正規表示式Python
- shell指令碼(14)-正規表示式指令碼
- shell 正規表示式詳細整理
- shell基礎 — 基本正規表示式
- [轉載] 正規表示式
- 轉義正規表示式中特殊字元字元
- vi 正規表示式替換
- 正規表示式在Java中的使用Java
- python 正規表示式匹配Python
- Python正規表示式手稿Python
- Python正規表示式大全Python
- python之正規表示式Python
- 正規表示式 轉義字元字元
- shell程式設計(四)| grep正規表示式程式設計
- shell程式設計(四)| sed 正規表示式程式設計
- 05 shell程式設計之正規表示式程式設計
- Python正規表示式詳解Python
- Python 正規表示式(RegEx)指南Python
- 詳解 Python 正規表示式Python
- 正規表示式(python3)Python
- 【Perl程式設計-6】正規表示式--替換+轉化程式設計
- 常用有效的正規表示式【轉】
- 轉|正規表示式之匹配中文
- 正規表示式的字串替換方法字串
- Java 正規表示式替換斜槓Java
- VS 正規表示式替換內容
- Python正規表示式匹配字串中的數字Python字串
- python中re模組的使用(正規表示式)Python
- python 中的正規表示式學習筆記Python筆記
- 『忘了再學』Shell基礎 — 24、Shell正規表示式的使用
- Python基礎之正規表示式Python