站長資訊網
        最全最豐富的資訊網站

        正則表達式筆記三則

        首字母大小寫無關模式
        有一段時間,我在寫正則表達式來匹配Drug關鍵字時,經常寫出 /viagra|cialis|anti-ed/ 這樣的表達式。為了讓它更美觀,我會給關鍵詞排序;為了提升速度,我會使用 /[Vv]iagra/ 而非/viagra/i ,只讓必要的部分進行大小寫通配模式。確切地說,我是需要對每個單詞的首字母進行大小寫無關的匹配。

        我寫了這樣的一個函數,專門用來批量轉換。

        復制代碼 代碼如下:
        #convert regex to sorted list, then provide both lower/upper case for the first letter of each word
        #luf means lower upper first

        sub luf{
        # split the regex with the delimiter |
        my @arr=sort(split(/|/,shift));

        # provide both the upper and lower case for the
        # first leffer of each word
        foreach (@arr){s/b([a-zA-Z])/[l$1u$1]/g;}

        # join the keyword to a regex again
        join(‘|’,@arr);
        }

        print luf “sex pill|viagra|cialis|anti-ed”;
        # the output is:[aA]nti-[eE]d|[cC]ialis|[sS]ex [pP]ill|[vV]iagra

        控制全局匹配下次開始的位置

        記得jyf曾經問過我,如何控制匹配開始的位置。嗯,現在我可以回答這個問題了。Perl 提供了 pos 函數,可以在 /g 全局匹配中調整下次匹配開始的位置。舉例如下:

        復制代碼 代碼如下:
        $_=”abcdefg”;
        while(/../g)
        {
        print $&;
        }

        其輸出結果是每兩個字母,即ab, cd, ef

        可以使用 pos($_)來重新定位下一次匹配開始的位置,如:

        復制代碼 代碼如下:
        $_=”abcdefg”;
        while(/../g)
        {
        pos($_)–; #pos($_)++;
        print $&;
        }

        輸出結果:

        復制代碼 代碼如下:
        pos($_)–: ab, bc, cd, de, ef, fg.
        pos($_)++: ab, de.

        可以閱讀 Perl 文檔中關于 pos的章節獲取詳細信息。

        散列與正則表達式替換
        《effective-perl-2e》第三章有這樣一個例子(見下面的代碼),將特殊符號轉義。

        復制代碼 代碼如下:
        my %ent = { ‘&’ => ‘amp’, ‘<‘ => ‘lt’, ‘>’ => ‘gt’ };
        $html =~ s/([&<>])/&$ent{$1};/g;

        這個例子非常非常巧妙。它靈活地運用了散列這種數據結構,將待替換的部分作為 key ,將與其對應的替換內容作為 value 。這樣只要有匹配就會捕獲,然后將捕獲的部分作為 key ,反查到 value 并運用到替換中,體現了高級語言的效率。

        不過,這樣的 Perl 代碼,能否移植到 Python 中呢? Python 同樣支持正則,支持散列(Python 中叫做 Dictionary),但是似乎不支持在替換過程中插入太多花哨的東西(替換行內變量內插)。

        查閱 Python 的文檔,(在 shell 下 執行 python ,然后 import re,然后 help(re)),:

        復制代碼 代碼如下:
        sub(pattern, repl, string, count=0)
        Return the string obtained by replacing the leftmost
        non-overlapping occurrences of the pattern in string by the
        replacement repl. repl can be either a string or a callable;
        if a string, backslash escapes in it are processed. If it is
        a callable, it’s passed the match object and must return
        a replacement string to be used.

        原來 python 和 php 一樣,是支持在替換的過程中使用 callable 回調函數的。該函數的默認參數是一個匹配對象變量。這樣一來,問題就簡單了:

        復制代碼 代碼如下:
        ent={‘<‘:”lt”,
        ‘>’:”gt”,
        ‘&’:”amp”,
        }

        def rep(mo):
        return ent[mo.group(1)]

        html=re.sub(r”([&<>])”,rep, html)

        python 替換函數 callback 的關鍵點在于其參數是一個匹配對象變量。只要明白了這一點,查一下手冊,看看該種對象都有哪些屬性,一一拿來使用,就能寫出靈活高效的 python 正則替換代碼。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲精品无码永久在线观看你懂的| 久久精品国产亚洲一区二区| 97r久久精品国产99国产精| 精品无码综合一区| 亚洲无删减国产精品一区| 99久久精品午夜一区二区| 精品久久久久久国产牛牛app| 91热成人精品国产免费| 国产精品影音先锋| 97久久超碰成人精品网站| 久久精品中文闷骚内射| 亚洲线精品一区二区三区| 欧美亚洲综合免费精品高清在线观看| 国产精品亚洲视频| 国产高清在线精品一区二区| 久久se精品一区精品二区| 91精品国产91久久久久福利| 精品国产一区二区三区久久久狼| 亚洲爆乳精品无码一区二区三区 | 国产国拍亚洲精品mv在线观看| 中文字幕无码精品亚洲资源网久久| 久久中文精品无码中文字幕| 精品一区二区三区色花堂| 精品国产国产综合精品| 国产精品亚洲专区无码WEB| 国产精品永久免费| 国产午夜精品一区二区三区小说 | 99在线精品视频观看免费| 99re热这里只有精品视频中文字幕 | 亚洲精品无码乱码成人| 亚洲无码精品浪潮| 亚洲国产另类久久久精品黑人 | 日韩精品电影一区亚洲| 日本免费精品一区二区三区| 亚洲精品NV久久久久久久久久| 中文字幕精品一区| 无码人妻精品一区二区三18禁| 久久亚洲私人国产精品| 国产精品自在线拍国产| 99精品国产丝袜在线拍国语| 国产精品福利在线观看|