想使用Regex來擷取一段文本中的任一字元,寫出如下匹配規則:
(.*)
結果運行之後才發現,無法獲得換行之後的文本。於是查了一下手冊,才發現Regex中,“.”(點符號)匹配的是除了分行符號“\n”以外的所有字元。
以下為正確的Regex匹配規則:
([\s\S]*)
同時,也可以用 “([\d\D]*)”、“([\w\W]*)” 來表示
字元
描述
\
將下一個字元標記為一個特殊字元、或一個原義字元、或一個 反向參考、或一個八進位轉義符。例如,'n' 匹配字元 "n"。'\n' 匹配一個分行符號。序列 '\\' 匹配 "\" 而 "\(" 則匹配 "("。
^
匹配輸入字串的開始位置。如果設定了 RegExp 對象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之後的位置。
$
匹配輸入字串的結束位置。如果設定了RegExp 對象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。
*
匹配前面的子運算式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。
+
匹配前面的子運算式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
?
匹配前面的子運算式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價於 {0,1}。
{n}
n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
{n,}
n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。
{n,m}
m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。
?
當該字元緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如,對於字串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。
.
匹配除 "\n" 之外的任何單個字元。要匹配包括 '\n' 在內的任何字元,請使用象 '[.\n]' 的模式。
(pattern)
匹配 pattern 並擷取這一匹配。所擷取的匹配可以從產生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 $0…$9 屬性。要匹配圓括弧字元,請使用 '\(' 或 '\)'。
(?:pattern)
匹配 pattern 但不擷取匹配結果,也就是說這是一個非擷取匹配,不進行儲存供以後使用。這在使用 "或" 字元 (|) 來組合一個模式的各個部分是很有用。例如, 'industr(?:y|ies) 就是一個比 'industry|industries' 更簡略的運算式。
(?=pattern)
正向預查,在任何匹配 pattern 的字串開始處匹配尋找字串。這是一個非擷取匹配,也就是說,該匹配不需要擷取供以後使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始。
(?!pattern)
負向預查,在任何不匹配 pattern 的字串開始處匹配尋找字串。這是一個非擷取匹配,也就是說,該匹配不需要擷取供以後使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始
(?=...)
前向肯定界定符。如果所含Regex,以 ... 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含運算式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。For example, Isaac (?=Asimov) will match 'Isaac ' only if it's followed by 'Asimov'. [b]...不能是運算式,以下相同[/b]。
(?!...)
前向否定界定符。與肯定界定符相反;當所含運算式不能在字串當前位置匹配時成功 .For example, Isaac (?!Asimov) will match 'Isaac ' only if it's not followed by 'Asimov'.
(?<=...)
後向肯定界定符。Matches if the current position in the string is preceded by a match for ... that ends at the current position.
(?<!...)
後向否定界定符。Matches if the current position in the string is not preceded by a match for .... This is called a negative lookbehind assertion.
x|y
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
[xyz]
字元集合。匹配所包含的任意一個字元。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]
負值字元集合。匹配未包含的任一字元。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]
字元範圍。匹配指定範圍內的任一字元。例如,'[a-z]' 可以匹配 'a' 到 'z' 範圍內的任意小寫字母字元。
[^a-z]
負值字元範圍。匹配任何不在指定範圍內的任一字元。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 範圍內的任一字元。
\b
匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B
匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx
匹配由 x 指明的控制字元。例如, \cM 匹配一個 Control-M 或斷行符號符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字元。
\d
匹配一個數字字元。等價於 [0-9]。
\D
匹配一個非數字字元。等價於 [^0-9]。
\f
匹配一個換頁符。等價於 \x0c 和 \cL。
\n
匹配一個分行符號。等價於 \x0a 和 \cJ。
\r
匹配一個斷行符號符。等價於 \x0d 和 \cM。
\s
匹配任何空白字元,包括空格、定位字元、換頁符等等。等價於 [ \f\n\r\t\v]。
\S
匹配任何非空白字元。等價於 [^ \f\n\r\t\v]。
\t
匹配一個定位字元。等價於 \x09 和 \cI。
\v
匹配一個垂直定位字元。等價於 \x0b 和 \cK。
\w
匹配包括底線的任何單詞字元。等價於'[A-Za-z0-9_]'。
\W
匹配任何非單詞字元。等價於 '[^A-Za-z0-9_]'。
\xn
匹配 n,其中 n 為十六進位轉義值。十六進位轉義值必須為確定的兩個數字長。例如,'\x41' 匹配 "A"。'\x041' 則等價於 '\x04' & "1"。Regex中可以使用 ASCII 編碼。.
\num
匹配 num,其中 num 是一個正整數。對所擷取的匹配的引用。例如,'(.)\1' 匹配兩個連續的相同字元。
\n
標識一個八進位轉義值或一個反向參考。如果 \n 之前至少 n 個擷取的子運算式,則 n 為反向參考。否則,如果 n 為八位元字 (0-7),則 n 為一個八進位轉義值。
\nm
標識一個八進位轉義值或一個反向參考。如果 \nm 之前至少有 nm 個獲得子運算式,則 nm 為反向參考。如果 \nm 之前至少有 n 個擷取,則 n 為一個後跟文字 m 的反向參考。如果前面的條件都不滿足,若 n 和 m 均為八位元字 (0-7),則 \nm 將匹配八進位轉義值 nm。
\nml
如果 n 為八位元字 (0-3),且 m 和 l 均為八位元字 (0-7),則匹配八進位轉義值 nml。
\un
匹配 n,其中 n 是一個用四個十六進位數字表示的 Unicode 字元。例如, \u00A9 匹配著作權符號 (?)。 表單底端
>>> str = '2007-2-23 11:00:22'
>>> pattern = re.compile('(\d{4})-(\d{1,2})-(\d{1,2})(.*)')
>>> result = pattern.search(str)
>>> reslist = result.groups()
>>> print reslist
('2007', '2', '23', ' 11:00:22')
Regex常常用來分析字串,編寫一個 RE 匹配感興趣的部分並將其分成幾個小組。舉個例子,一個 RFC-822 的頭部用 ":" 隔成一個頭部名和一個值,這就可以通過編寫一個Regex匹配整個頭部,用一組匹配頭部名,另一組匹配頭部值的方式來處理。
組是通過 "(" 和 ")" 元字元來標識的。 "(" 和 ")" 有很多在數學運算式中相同的意思;它們一起把在它們裡面的運算式組成一組。舉個例子,你可以用重複限制符,象 *, +, ?, 和 {m,n},來重複的群組裡的內容,比如說(ab)* 將匹配零或更多個重複的 "ab"。
組用 "(" 和 ")" 來指定,並且得到它們匹配文本的開始和結尾索引;這就可以通過一個參數用 group()、start()、end() 和 span() 來進行檢索。組是從 0 開始計數的。組 0 總是存在;它就是整個 RE,所以 `MatchObject` 的方法都把組 0 作為它們預設的參數。稍後我們將看到怎樣表達不能得到它們所匹配文本的 span。
>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'
groups() 方法返回一個包含所有小組字串的元組,從 1 到 所含的小組號。
>>> m = re.search('(?<=-)\w+', 'spam-egg')
>>> reslist = m.groups()
>>> reslist
()
>>> m.group()
'egg'
>>> m = re.search('(?<=-)(\w+)', 'spam-egg')
>>> reslist = m.groups()
>>> reslist
('egg',)
>>> m.group(0)
'egg'
>>>
一:re的幾個函數
1: compile(pattern, [flags])
根據Regex字串 pattern 和可選的flags 產生Regex 對象
產生Regex 對象(見二)
其中flags有下面的定義:
I 表示大小寫忽略
L 使一些特殊字元集,依賴於當前環境
M 多行模式 使 ^ $ 匹配除了string開始結束外,還匹配一行的開始和結束
S “.“ 匹配包括‘\n’在內的任一字元,否則 . 不包括‘\n’
U Make \w, \W, \b, \B, \d, \D, \s and \S dependent on the Unicode character properties database
X 這個主要是表示,為了寫Regex,更可毒,會忽略一些空格和#後面的注釋
其中S比較常用,
應用形式如下
import re
re.compile(……,re.S)
2: match(pattern,string,[,flags])
讓string匹配,pattern,後面分flag同compile的參數一樣
返回MatchObject 對象(見三)
3: split( pattern, string[, maxsplit = 0])
用pattern 把string 分開
>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
括弧‘()’在pattern內有特殊作用,請查手冊
4:findall( pattern, string[, flags])
比較常用,
從string內尋找不重疊的符合pattern的運算式,然後返回list列表
5:sub( pattern, repl, string[, count])
repl可以時候字串,也可以式函數
當repl是字串的時候,
就是把string 內符合pattern的子串,用repl替換了
當repl是函數的時候,對每一個在string內的,不重疊的,匹配pattern
的子串,調用repl(substring),然後用傳回值替換substring
>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
... r'static PyObject*\npy_\1(void)\n{',
... 'def myfunc():')
'static PyObject*\npy_myfunc(void)\n{'
>>> def dashrepl(matchobj):
... if matchobj.group(0) == '-': return ' '
... else: return '-'
>>> re.sub('-{1,2}', dashrepl, 'pro----gram-files')
'pro--gram files'
二:Regex對象 (Regular Expression Objects )
產生方式:通過 re.compile(pattern,[flags])回
match( string[, pos[, endpos]]) ;返回string[pos,endpos]匹配
pattern的MatchObject(見三)
split( string[, maxsplit = 0])
findall( string[, pos[, endpos]])
sub( repl, string[, count = 0])
這幾個函數和re模組內的相同,只不過是調用形式有點差別
re.幾個函數和 Regex對象的幾個函數,功能相同,但同一程式如果
多次用的這些函數功能,Regex對象的幾個函數效率高些
三:matchobject
通過 re.match(……) 和 re.compile(……).match返回
該對象有如下方法和屬性:
方法:
group( [group1, ...])
groups( [default])
groupdict( [default])
start( [group])
end( [group])
說明這幾個函數的最好方法,就是舉個例子
matchObj = re.compile(r"(?P<int>\d+)\.(\d*)")
m = matchObj.match('3.14sss')
#m = re.match(r"(?P<int>\d+)\.(\d*)", '3.14sss')
print m.group()
print m.group(0)
print m.group(1)
print m.group(2)
print m.group(1,2)
print m.group(0,1,2)
print m.groups()
print m.groupdict()
print m.start(2)
print m.string
輸出如下:
3.14
3.14
3
14
('3', '14')
('3.14', '3', '14')
('3', '14')
{'int': '3'}
2
3.14sss
所以group() 和group(0)返回,匹配的整個運算式的字串
另外group(i) 就是Regex中用第i個“()” 括起來的匹配內容
('3.14', '3', '14')最能說明問題了。
說明:本文轉自互連網