re正則表達式

正則是一種處理字符串的工具
它有兩種風格 perl posix

例: 如何判斷一個變量中是否有大寫字母 

    name = 'harry'
    echo $name |egrep '[A-Z]' &> /dev/null
    if [ $? -eq 0];then
        echo 'have'
    fi

正則如何寫:

普通字符:
a b X 1 2

元字符:(是有特殊含意的字符)
. : 表示除了換行符\n,以外的任意一個字符
^ : 表示字符串的開頭
$ : 表示字符串的結尾
* : 匹配前一個字符0到無數次
+ : 匹配前一個字符1到無數次
? : 匹配前一個字符 0次或1次

    {m,n}   : 匹配前一個字符 0次或1次
                {5,10} {3} {5,}  {,10}
    []      : 匹配裏面任意一個字符即可
                [aeiou]  [a-z] [A-Z]  [0-9]
    [^]     : 取反,不匹配裏面任意一個字符即可
                [^aeiou]  [^a-z] [^A-Z]  [^0-9]
    ()      : 分組,將小括號裏面的內容作爲一個整體,如果需要引用可以使用 \1 \2
    |       : 或 A|B  匹配A段或B段中的一個即可。它會將整個正則完全切開,除非放到()裏面
    \       : 轉義,\. 表示一個普通的點
    |       : 或 A|B  匹配A段或B段中的一個即可。它會將整個正則完全切開,除非放到()裏面
    貪婪    : 正則默認是貪婪的,即當遇到不定次數的匹配時,先往多裏匹配
              不定次數的匹配指: * ? +  {}
              如果希望使用非貪婪模式,可以在不定次數的匹配後面加上? (shell不支持)

預定義字符集
\d : 相當於 [0-9]
\D : 相當於 [^0-9]
\w : 相當於 [a-zA-Z0-9_]
\W : 相當於 [^a-zA-Z0-9_]
\b : 單詞邊界 ,實際上指\w與\W之間的分界
\B : 非單詞邊界
\s : 空字符 [ \t\v\r\n\f]
\S : 非空字符 [^ \t\v\r\n\f]
python 特殊表達形式:

分組:
    (正則)   \1
     (?P<名字>正則)     \1   (?P=名字)
        cre = re.compile(r'(?P<name>l.ve)(.*)(?P=name)')
        cre = re.compile(r'(?P<name>l.ve)(.*)\1')
取消分組含意 : 
    (?:正則)  只是將小括號作爲一個整體,並沒有分組的含意 

斷言(瞭解即可)
    (?=表達式)  : 匹配的最後部分要可以匹配此表達式,但最後不要返回此表達式的匹配
    (?<=表達式) : 匹配的開頭部分要可以匹配此表達式,但最後不要返回此表達式的匹配
    (?!表達式)  : 匹配的最後部分要不可以匹配此表達式,但是不支持不定長度的正則
    (?<!表達式) : 匹配的開頭部分要不可以匹配此表達式,但是不支持不定長度的正則

python 的正則使用:

import re
cre = re.complie(正則,flag)
#cre = re.complie(正則,re.I|re.S)

正則flag:
re.I : 不區分大小寫
re.S : .可以匹配任意字符,包括\n
re.M : 多行模塊,如果匹配多行字符,則會有多個 行首和行尾

python 正則的操作

匹配查找 search match findall finditer

search : 從左向右匹配,只匹配一次,匹配成功立即返回匹配對象 ,否則返回None
import re
s = ‘http://www.baidu.com/lkfjkdsalfjdlas
s1 = ‘aaa Http://www.baidu.com/lkfjkdsalfjdlas http://mp3.baidu.com/jlkfjdsalfjd

        cre = re.compile('http.*?baidu\.com',re.I|re.S)
        ret = cre.search(s1)
        if ret:
            print(ret.group())

match : 從左向右匹配,只在開頭匹配一次,匹配成功立即返回一個匹配對象 ,否則返回None。相當於正則表達式前面有 ^
import re

    s = 'http://www.baidu.com/lkfjkdsalfjdlas'
    s1 = 'aaa Http://www.baidu.com/lkfjkdsalfjdlas  http://mp3.baidu.com/jlkfjdsalfjd'

    cre = re.compile('http.*?baidu\.com',re.I|re.S)
    ret = cre.match(s)
    if ret:
        print(ret.group())

findall : 從左向右查找所有匹配,把所有匹配內容放列表中返回,如果沒有匹配返回空列表
import re

    s = 'http://www.baidu.com/lkfjkdsalfjdlas'
    s1 = 'aaa Http://www.baidu.com/lkfjkdsalfjdlas  http://mp3.baidu.com/jlkfjdsalfjd'

    cre = re.compile('http.*?baidu\.com',re.I|re.S)
    ret = cre.findall(s1)
    print(ret)

finditer : 從左向右匹配,把所有匹配的結果以匹配對象的形式放到一個生成器中。
import re

    s = 'http://www.baidu.com/lkfjkdsalfjdlas'aaa
    s1 = 'aaa Http://www.baidu.com/lkfjkdsalfjdlas  http://mp3.baidu.com/jlkfjdsalfjd'

    cre = re.compile('http.*?baidu\.com',re.I|re.S)
    ret = cre.finditer(s1)
    for i in ret:
        print(i.group())

分組示例:
import re

    s = 'aaa love is 666 lover 888 lover ljljl'
    s1 = 'Http://www.baidu live 999 lover aad'

    cre = re.compile(r'(l.ve)(.*)\1')
    ret = cre.finditer(s)
    for i in ret:
        print(i)
        print(i.group())        # 得到整個正則表達式匹配的內容
        print(i.group(2))       # 得到正則中第二個分組中的內容
        print(i.groups())       # 得到正則中所有分組的內容

切割 split 可以根據多個匹配進行切割
import re

s = 'today is:a good,day'
cre = re.compile(r'[ :,]')
cre = re.compile(r' |:|,')
ret = cre.split(s)
print(ret)

替換 sub subn
正則.sub(替換成字符串,被替換的字符串,替換的次數)
subn的用法和sub一樣,只是會另外返回替換的次數
例:
import re

    s = 'tom218 is15 Tom9 is98 tam '
    cre = re.compile('t.m',re.I)
    ret = cre.sub('XYZ',s)
    print(ret)
    ret = cre.subn('XYZ',s)
    print(ret)
    ret = cre.sub('XYZ',s,2)
    print(ret)

例
    import re

    s = 'tom218 is95 Tom9 is98 tam '
    def re_replace(obj):
        ret = obj.group()
        ret = int(ret) * 2
        return str(ret)

    cre = re.compile('[0-9]+')
    ret = cre.sub(re_replace,s)
    print(ret)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章