<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 7.2.?個案研究:街道地址 這一系列的例子是由我幾年前日常工作中的現實問題啟發而來的,當時我需要從一個老化系統中導出街道地址,在將它們導入新的系統之前,進行清理和標準化。(看,我不是只將這些東西堆到一起,它有實際的用處。)這個例子展示我如何處理這個問題。 ## 例?7.1.?在字符串的結尾匹配 ``` >>> s = '100 NORTH MAIN ROAD' >>> s.replace('ROAD', 'RD.') '100 NORTH MAIN RD.' >>> s = '100 NORTH BROAD ROAD' >>> s.replace('ROAD', 'RD.') '100 NORTH BRD. RD.' >>> s[:-4] + s[-4:].replace('ROAD', 'RD.') '100 NORTH BROAD RD.' >>> import re >>> re.sub('ROAD$', 'RD.', s) '100 NORTH BROAD RD.' ``` | | | | --- | --- | | \[1\] | 我的目標是將街道地址標準化,`'ROAD'` 通常被略寫為 `'RD.'`。乍看起來,我以為這個太簡單了,只用字符串的方法 `replace` 就可以了。畢竟,所有的數據都已經是大寫的了,因此大小寫不匹配將不是問題。并且,要搜索的串`'ROAD'`是一個常量,在這個迷惑的簡單例子中,`s.replace` 的確能夠勝任。 | | \[2\] | 不幸的是,生活充滿了特例,并且我很快就意識到這個問題。比如:`'ROAD'` 在地址中出現兩次,一次是作為街道名稱 `'BROAD'` 的一部分,一次是作為 `'ROAD'` 本身。`replace` 方法遇到這兩處的`'ROAD'`并沒有區別,因此都進行了替換,而我發現地址被破壞掉了。 | | \[3\] | 為了解決在地址中出現多次`'ROAD'`子串的問題,有可能采用類似這樣的方法:只在地址的最后四個字符中搜索替換 `'ROAD'` (s[-4:]),忽略字符串的其他部分 (s[:-4])。但是,你可能發現這已經變得不方便了。例如,該模式依賴于你要替換的字符串的長度了 (如果你要把 `'STREET'` 替換為 `'ST.'`,你需要利用 `s[:-6]` 和 `s[-6:].replace(...)`)。你愿意在六月個期間回來調試它們么?我本人是不愿意的。 | | \[4\] | 是時候轉到正則表達式了。在 Python 中,所有和正則表達式相關的功能都包含在 `re` 模塊中。 | | \[5\] | 來看第一個參數:`'ROAD$'`。這個正則表達式非常簡單,只有當 `'ROAD'` 出現在一個字符串的尾部時才會匹配。字符`$`表示“字符串的末尾”(還有一個對應的字符,尖號`^`,表示“字符串的開始”)。 | | \[6\] | 利用 `re.sub` 函數,對字符串 `s` 進行搜索,滿足正則表達式 `'ROAD$'` 的用 `'RD.'` 替換。這樣將匹配字符串 `s` 末尾的 `'ROAD'`,而不會匹配屬于單詞 `'ROAD'` 一部分的 `'ROAD'`,這是因為它是出現在 `s` 的中間。 | 繼續我的清理地址的故事。很快我發現,在上面的例子中,僅僅匹配地址末尾的 `'ROAD'` 不是很好,因為不是所有的地址都包括表示街道的單詞 (`'ROAD'`);有一些直接以街道名結尾。大部分情況下,不會遇到這種情況,但是,如果街道名稱為 `'BROAD'`,那么正則表達式將會匹配 `'BROAD'` 的一部分為 `'ROAD'`,而這并不是我想要的。 ## 例?7.2.?匹配整個單詞 ``` >>> s = '100 BROAD' >>> re.sub('ROAD$', 'RD.', s) '100 BRD.' >>> re.sub('\\bROAD$', 'RD.', s) '100 BROAD' >>> re.sub(r'\bROAD$', 'RD.', s) '100 BROAD' >>> s = '100 BROAD ROAD APT. 3' >>> re.sub(r'\bROAD$', 'RD.', s) '100 BROAD ROAD APT. 3' >>> re.sub(r'\bROAD\b', 'RD.', s) '100 BROAD RD. APT 3' ``` | | | | --- | --- | | \[1\] | 我真正想要做的是,當 `'ROAD'` 出現在字符串的末尾,并且是作為一個獨立的單詞時,而不是一些長單詞的一部分,才對他進行匹配。為了在正則表達式中表達這個意思,你利用 `\b`,它的含義是“單詞的邊界必須在這里”。在 Python 中,由于字符 `'\'` 在一個字符串中必須轉義,這會變得非常麻煩。有時候,這類問題被稱為“反斜線災難”,這也是 Perl 中正則表達式比 Python 的正則表達式要相對容易的原因之一。另一方面,Perl 也混淆了正則表達式和其他語法,因此,如果你發現一個 bug,很難弄清楚究竟是一個語法錯誤,還是一個正則表達式錯誤。 | | \[2\] | 為了避免反斜線災難,你可以利用所謂的“原始字符串”,只要為字符串添加一個前綴 `r` 就可以了。這將告訴 Python,字符串中的所有字符都不轉義;`'\t'` 是一個制表符,而 `r'\t'` 是一個真正的反斜線字符 `'\'`,緊跟著一個字母 `'t'`。我推薦只要處理正則表達式,就使用原始字符串;否則,事情會很快變得混亂 (并且正則表達式自己也會很快被自己搞亂了)。 | | \[3\] | (一聲嘆息) 很不幸,我很快發現更多的與我的邏輯相矛盾的例子。在這個例子中,街道地址包含有作為整個單詞的`'ROAD'`,但是它不是在末尾,因為地址在街道命名后會有一個房間號。由于 `'ROAD'` 不是在每一個字符串的末尾,沒有匹配上,因此調用 `re.sub` 沒有替換任何東西,你獲得的只是初始字符串,這也不是我們想要的。 | | \[4\] | 為了解決這個問題,我去掉了 `$` 字符,加上另一個 `\b`。現在,正則表達式“匹配字符串中作為整個單詞出現的`'ROAD'`”了,不論是在末尾、開始還是中間。 |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看