Python 正則表達式模組re(Regular expression) -2 (字元符號-設定樣式Pattern)

在上一篇文章裡
我們簡單的示範並使用了re進行了我們的第一次字串匹配

接著本篇我們將針對目標字串樣式(pattern)作進一步的介紹

*********************************************************************************
對於pattern樣式除了直接輸入我們需要的文字,我們還能使用以下字元符號達到更好的匹配效果

特別字元:
 . :匹配除了\n(換行)字元以外任何字元
\d:匹配任何十進位數字
\D:匹配任何非數字字元
\s:匹配任何空白字元
\S:匹配任何非空白字元
\w:匹配任何字母和數字字元
\W:匹配任何非字母和數字字元
[]:中括號內為匹配的字符集
re.compile(r'L....n') #匹配開頭為L、結尾為n、中間為4個任意字元的字串

頭尾&位置:
^ :匹配字串的開始位置字元
$ :匹配字串的結束位置字元
\A:匹配指定字符串開頭
\Z:匹配指定字符串結尾
re.compile(r'^abc[a-zA-Z0-9]@gmail.com$')
#匹配開頭為abc、結尾為@gmail.com、中間為1個英文字母或數字的字串


次數:
{m}:匹配前一字符m次
re.compile(r'[a-zA-Z0-9]{3}')
#匹配由3個字母或數字組成的字串

{m,n}:匹配前一字符m~n次
re.compile(r'[a-zA-Z0-9]{1,3}')
#匹配由1~3個字母或數字組成的字串

* :匹配前一字符零次或多次
re.compile(r'[a-zA-Z0-9]*')
#匹配由0個字母或數字以上組成的字串

+ :匹配前一字符一次或多次
re.compile(r'[a-zA-Z0-9]+')
#匹配由1個字母或數字以上組成的字串

? :匹配前一字符零次或一次
re.compile(r'[a-zA-Z0-9]?')
#匹配由0~1個字母或數字組成的字串

*?,+?,??:匹配第一個字元符號的最少次 r'[a-zA-Z0-9]*?'
 *? -> 匹配*的最少次:0次
 +? -> 匹配+的最少次:1次
 ?? -> 匹配?的最少次:0次


特別功能:
 \ :將下一個字元以特殊字元字元表示
EX:\n,\t,\\
 | :or的表達式
re.compile(r'a|b')
#匹配x或y的字元

():以小括號作為分組
re.compile(r'(gmail|yahoo).com')
#匹配gmail.com或yahoo.com的字串

\num:對()的分組編號並使用
re.compile(r'<([\w]+)>[\w]+<\1>')
#依據前面分組的內容匹配EX:<book>python<book>(([\w]+)=book ->\1=book)


進階用法
(?#...):註解
re.compile(r'(?P:a|b|c)(?#comment)1234)
#匹配abc1234 => c1234

(?=...):之後的字串需匹配,不消耗字串且不放進結果
re.compile(r'abc(?=1234)123
#匹配 abc1234 => abc123

(?!...):之後的字串需不匹配,不消耗字串且不放進結果
re.compile(r'ab(?!\d)a123
#匹配 abc1234 => abc123


(?<=...):之前的字串需匹配,不消耗字串且不放進結果
re.compile(r'c(?<=abc)123
#匹配 abc1234 => c123

(?<!...):之前的字串需不匹配,不消耗字串且不放進結果
re.compile(r'(?<!\d)c123
#匹配 abc1234 => c123

(?P<name>):為分組取名
(?P=name):引用名字為name的分組
re.compile(r'<(?P<mark>[\w]+)>[\w]+<(?P=mark)>')-> mark為分組名
#依據以命名的分組內容匹配EX:<book>python<book>(([\w]+)=book ->mark=book)


接下來將要介紹flag
flag是什麼?
compile的完整形式其實是re.compile(pattern[,flag=0])
flag是個不一定要輸入的參數,但flag可以指定匹配方式,而且可使用 | 隔開同時使用多個匹配方式
re.A(re.ASCII)             :同(?a),讓\w,\W,\b,\B,\d,\D,\s,\S依ASCII匹配
re.I(re.IGNORECASE):同(?i),忽略大小寫
re.L(re.LOCALE)         :同(?L),讓\w,\W,\b,\B,\s,\S依本地字符編碼(Python 3.6 已被移除)
re.M(re.MULTILINE)    :同(?m),^,$匹配不同行的頭和尾
re.S(re.DOTALL)         :同(?s),'.'匹配全部,包括\n
re.X(re.VERBOSE)     :同(?x),忽略空白字符,且可以用#當作註解,可多行建立pattern,利用"""string"""
re.DEBUG                   :顯示 pattern 的邏輯
re.compile(r'AbcabC.',re.I | re.S)
=re.compile(r'A|a]bcab[C|c][\n|.]')



關於re.compile(pattern)設定大概會用到就是這些
在下一篇將會說明匹配及匹配結果的使用方法

留言

這個網誌中的熱門文章