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)

留言

熱門文章