Python Cookbook (2-1) 字串操作和正規表達式
1. split and join 字串操作:
一般的字串就能呼叫 split 方法來分割成 list。
quote = "Extreme fear can neither fight nor fly" quote.split(" ") # ['Extreme', 'fear', 'can', 'neither', 'fight', 'nor', 'fly']
使用 re 的 split 可以讓配對更加彈性。
line = 'asdf fjdk; afed, fjek,asdf, foo' import re re.split(r'[;,\s]\s*', line)
join 是字串的方法,我們使用 join 把 list 轉成字串。
", ".join(re.split(r'[;,\s]\s*', line))
2. fnmatch and fnmatchcase 比對:
使用 shell wildcard patterns 進行比對,因為 windows shell 不區分大小寫所以比對結果會和 Unix 不同。
from fnmatch import fnmatch, fnmatchcase file = "aka123.jpg" fnmatch(file, "*[0-9]*.jpg") fnmatch(file, "?ka[0-9]*.jpg") fnmatchcase(file, "?KA[0-9]*.jpg")
fnmatch 也可用於 list 元素的過濾。
files = ["a1.jpg", "b.jpg", "c3.png"] [file for file in files if fnmatch(file, "*[0-9].jpg")]
3. 正規表達式 (regular expression)批配:
正規表達式能讓我們比對更複雜的 pattern。
import re dp = re.compile(r"\d+/\d+/\d+") dp.match("2018/04/30") is None
若比對失敗會回傳 None。
回傳所有 match 的 pattern。
dp = re.compile(r"\d+/\d+/\d+") print(dp.findall("cooper: 2018/04/30, bear: 2018/04/29")) # ['2018/04/30', '2018/04/29']
用括號對特定值進行捕捉。
dp = re.compile(r"(\d+)/\(d+)/\d+") m = dp.match("2018/04/30") print(m.groups())
dp = re.compile(r"(\d+)/(\d+)/\d+") m = dp.findall("bear: 2018/04/30, cooper: 2018/04/29") print(m)
4. 使用正規表達式進行字串替換:
dp = re.compile(r"(\d+)/(\d+)/(\d+)") dp.sub(r"\2-\3-\1","2018/04/30") # '30-04-2018'
5. nongreedy:
下面是一個我以前常犯的錯誤,假設你想找出 @ 和第一個.之間的字你可能會寫成這樣。
cooperbear = "cb@yahoo.com.tw" ep = re.compile(r".*@(.+)\..*") ep.findall(cooperbear) # ['yahoo.com']
* 預設會找尋最大批配 (greedy)。
使用 ? 告訴 python 要找尋最小批配 (nongreedy)
cooperbear = "cb@yahoo.com.tw" ep = re.compile(r".*@(.+?)\..*") ep.findall(cooperbear) # ['yahoo']
Reference
[1] David Beazley, Brian K. Jones, Python Cookbook, 3e , O'Reilly Media (2014)
留言
張貼留言