python3: 字符串和文本(2)
阿新 • • 發佈:2019-01-29
表達式 lower 匹配 upper code 語言 修飾符 cti color : 你正在試著用正則表達式匹配某個文本模式,但是它找到的是模式的最長可能匹配。 而你想修改它變成查找最短的可能匹配。
6. 字符串忽略大小寫的搜索替換
>>> text = ‘UPPER PYTHON, lower python, Mixed Python‘ >>> re.findall(‘python‘, text, flags=re.IGNORECASE) [‘PYTHON‘, ‘python‘, ‘Python‘] >>> re.sub(‘python‘, ‘snake‘, text, flags=re.IGNORECASE) ‘UPPER snake, lower snake, Mixed snake‘ >>>
7.最短匹配
Q
S:這個問題一般出現在需要匹配一對分隔符之間的文本的時候(比如引號包含的字符串)。 為了說明清楚,考慮如下的例子:模式 r‘\"(.*)\"‘
的意圖是匹配被雙引號包含的文本。(.)匹配除了換行外的任何字符
>>> str_pat = re.compile(r‘"(.*)"‘) >>> text1 = ‘Computer says "no."‘ >>> str_pat.findall(text1) [‘no.‘] >>> text2 = ‘Computer says "no." Phone says "yes."‘ >>> str_pat.findall(text2) [‘no." Phone says "yes.‘]
第二個例子中搜索 text2
的時候返回結果並不是我們想要的。
為了修正這個問題,可以在模式中的*操作符後面加上?修飾符,就像這樣:
>>> str_pat = re.compile(r‘"(.*?)"‘) >>> str_pat.findall(text2) [‘no.‘, ‘yes.‘] >>>
通過在 *
或者 +
這樣的操作符後面添加一個 ?
可以強制匹配算法改成尋找最短的可能匹配。
8. 多行匹配模式
Q: 你正在試著使用正則表達式去匹配一大塊的文本,而你需要跨越多行去匹配。S:這個問題很典型的出現在當你用點(.)去匹配任意字符的時候,忘記了點(.)不能匹配換行符的事實。 比如,假設你想試著去匹配C語言分割的註釋:
python3: 字符串和文本(2)