在 Shell 中轉換 Python 正規表示式

华科云商小雪發表於2024-03-13

在Shell中,我們通常可以使用 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 的格式,從而在Shell中進行文字處理。希望這個示例對你有幫助。如有更多的問題可以留言一起討論。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3008794/,如需轉載,請註明出處,否則將追究法律責任。

相關文章