列出幾個常用的pattern:
Special Sequences:
- \d: 任何數字:0 - 9。 等同於 [0-9]
- \D: (大寫字母表示與原字母反意) 與\d相反,表示任何非數字,就是除了 0 - 9之外的所有項目。等同於[^0-9]
- \s: 任何空白, 包含\t\v\f\r\n。等同於[ \t\v\f\r\n]
- \S: 與\s相反,表示任何非空白。等同於[^ \t\v\f\r\n]
- \w: 任何字母與數字字元:a - z & A - Z & 0 - 9 & _。等同於[a-zA-Z0-9_]
- \W: 任何非字母與數字字元。等同於[^a-zA-Z0-9_]
如果想同時間多次使用同一個matching character,可以用metacharacters來達成
- . : dot, 任何字元,除了換行
- ^: 表字串開頭
- $: 表字串結尾
- ?: 重複 0次或 1次
- *: 重複 0次或多次
- +: 重複 1次或多次,至少必須出現一次
- {n}: 重複n次。例如 {3} 表示重複 3次
- {x, y}: 重複次數在 x 到 y之間。例如{3, 5}表示重複 3 ~ 5次
- {, y}: 最多 y次
- {x, }: 最少 x次
- []: 表中括號內任一個
- (): sub-pattern
Method/Attribute | Purpose |
---|---|
match() | 從字串頭開始match. Match不到的話,return None |
search() | 搜尋整個字串,但只回傳找到的第一筆。Search不到return None |
findall() | 搜尋整個字串,把找到的所有data放在list裡回傳 |
finditer() | 回傳找到data的iterator |
例如要從這個字串當中,找出電話號碼 "Hi , if you need more information, please call 412-555-1234 or 268-111-5678"
>>> import re
>>> data = "Hi , if you need more information, please call 412-555-1234 or 268-111-5678"
>>> re.search(r'\d\d\d-\d\d\d-\d\d\d\d', data)
<_sre.SRE_Match object; span=(47, 59), match='412-555-1234'>
- r'\d\d\d-\d\d\d-\d\d\d\d':
pattern前面的 r代表這是 raw string,即是請python不要試圖解釋 \ 反斜線字元的意思。用在表示pattern時,會比較方便,不然就必須麻煩的寫成 '\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d' - Regex matching pattern: '\d\d\d-\d\d\d-\d\d\d\d'
代表請re幫我在data string當中找出含有 "3個數字-3個數字-4個數字"這個pattern的substring。這邊可以使用metacharactors簡化成 '\d{3}-\d{3}-\d{4}'
可以使用re.search搭配Regex matching pattern,直接對data string作search。
或者使用預先編譯(precompile),把他編為一個模式物件(pattern object),然後再使用它來做matching。
>>> phoneNumRegex = re.compile(r'\d{3}-\d{3}-\d{4}')
>>> mo = phoneNumRegex.search(data)
>>> mo
<_sre.SRE_Match object; span=(47, 59), match='412-555-1234'>
使用match(), search()如果成功找到pattern的話,會return match object,也就是上例的mo。
要對mach object做query的動作的話,可以使用下列object
Method/Attribute | Purpose |
---|---|
group() | 回傳match到的字串 |
start() | 回傳match結果的起始位置 |
end() | 回傳match結果的結束位置 |
span() | 回傳(start, end)的tuple |
'412-555-1234'
這時眼尖的你應該會發現,input字串裡有兩組符合pattern的substring,為什麼只回傳一組?這是因為seach() method只會回傳找到的第一筆資料,如果要回傳全部的話,就必須使用findall() method,但這時回傳的就會是一個list,而不是match object.
>>> mo = re.findall(r'\d{3}-\d{3}-\d{4}', data)
>>> mo
['412-555-1234', '268-111-5678']
>>> mo = re.search(r'(\d{3})-(\d{3})-(\d{4})', data)
>>> mo.group(0)
'412-555-1234'
>>> mo.group(1)
'412'
>>> mo.group(2)
'555'
>>> mo.group(3)
'1234'
>>> mo.groups()
('412', '555', '1234')
沒有留言:
張貼留言