您是否想過在文件中尋找某些文字或確保文字符合某種格式(例如電子郵件地址)的關鍵是什麼,以及其他類似的操作?
此類操作的關鍵是正規表示式(regex)。讓我們看看正規表示式的一些定義。在維基百科中,正規表示式的定義如下:
定義搜尋模式的字元序列,主要用於與字串的模式匹配或字串匹配,即「尋找和取代」之類的操作。這個概念出現在 20 世紀 50 年代,當時美國數學家 Stephen Kleene 形式化了正則語言的描述,並與 Unix 文本處理實用程式 ed(編輯器)和 grep(過濾器)一起普遍使用。
regular-expressions.info 的另一個很好的定義是:
正規表示式(簡稱regex或regexp)是用來描述搜尋模式的特殊文字字串。您可以將正規表示式視為類固醇的通配符。您可能熟悉通配符表示法,例如 *.txt,用於在檔案總管中尋找所有文字檔案。正規表示式等效項是 .*\.txt$
我知道正規表示式的概念聽起來可能還是有點模糊。因此,讓我們來看一些正規表示式的範例,以便更好地理解這個概念。
在本節中,我將向您展示一些正規表示式的範例,以幫助您進一步理解這個概念。
假設您有這個正規表示式:
/abder/
這只是告訴我們只匹配單字 abder
。
這個正規表示式怎麼樣?
/a[nr]t/
您可以如下閱讀此正規表示式:找到一個文字模式,第一個字母是a
,最後一個字母是t
,這些字母之間是n
或r
。所以符合的字是 ant
和 art
。
現在讓我給你一個小測驗。如何寫以 ca
開頭,並以以下一個或全部字元 tbr
結尾的正規表示式?是的,這個正規表示式可以寫成如下:
/ca[tbr]/
如果您看到以抑揚音符號 ^
開頭的正規表示式,則表示符合以 ^
之後提到的字串開頭的字串。因此,如果您有下面的正規表示式,它會匹配以 This
開頭的字串。
/^This/
因此,在以下字串中:
My name is Abder This is Abder This is Tom
基於正規表示式 /^This/
,將符合以下字串:
This is Abder This is Tom
如果我們想要匹配以某個字串結尾的字串怎麼辦?在本例中,我們使用美元符號 $
。這是一個例子:
Abder$
因此,在上面的字串(三行)中,將使用此正規表示式來匹配以下模式:
My name is Abder This is Abder
那麼,您對這個正規表示式有何看法?
^[A-Z][a-z]
我知道乍看之下可能看起來很複雜,但讓我們一點一點地看一下。
我們已經了解了什麼是抑揚音 ^
。這意味著匹配以某個字串開頭的字串。 [A-Z]
指的是大寫字母。因此,如果我們閱讀正規表示式的這一部分: ^[A-Z]
,它告訴我們匹配以大寫字母開頭的字串。最後一部分 [a-z]
表示找到以大寫字母開頭的字串後,後面會跟著字母表裡的小寫字母。
那麼,使用此正規表示式將符合下列哪些字串?如果您不確定,您可以使用 Python(我們將在下一節中看到)來測試您的答案。
abder Abder ABDER ABder
正規表示式是一個非常廣泛的主題,這些範例只是為了讓您了解它們是什麼以及我們為什麼使用它們。
RexEgg 是了解更多有關正規表示式並查看更多範例的一個很好的參考。
現在讓我們來看看有趣的部分。我們希望了解如何在 Python 中使用上述一些正規表示式。我們將用來在 Python 中處理正規表示式的模組是 re
模組。
第一個範例是關於尋找單字 abder
。在 Python 中,我們將按如下方式執行此操作:
import re text = 'My name is Abder' match_pattern = re.match(r'Abder', text) print match_pattern
如果執行上面的Python腳本,您將得到輸出:None
!
該腳本運作得很好,但問題在於函數 match()
的工作方式。如果我們返回 re
模組文檔,這就是函數 match()
的作用:
如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。如果字符串与模式不匹配,则返回 None;请注意,这与零长度匹配不同。
啊哈,从这里我们可以看出,match()
仅当在字符串的开头找到匹配项时才会返回结果。
我们可以使用函数 search()
,这是基于文档的:
扫描字符串,查找正则表达式模式产生匹配的第一个位置,并返回相应的匹配对象。如果字符串中没有位置与模式匹配,则返回 None;请注意,这与在字符串中的某个点查找零长度匹配不同。
因此,如果我们编写上面的脚本,但使用 search()
而不是 match()
,我们会得到以下输出:
<_sre.sre_match></_sre.sre_match>
即返回了一个匹配对象
。
如果我们想返回结果(字符串匹配),我们使用 group()
函数。如果我们想查看整个比赛,我们使用 group(0)
。因此:
打印 match_pattern.group(0)
将返回输出:Abder
。
如果我们采用上一节中的第二个正则表达式,即 /a[nr]t/
,则可以用 Python 编写如下:
import re text = 'This is a black ant' match_pattern = re.search(r'a[nr]t', text) print match_pattern.group(0)
此脚本的输出是:ant
。
文章越来越长,Python 中的正则表达式主题即使不是一本书,也肯定需要不止一篇文章。
然而,本文旨在让您快速入门并有信心进入 Python 正则表达式的世界。您可以参考 re
文档来了解有关此模块的更多信息以及如何深入了解该主题。
以上是Python中的正規表示式的詳細內容。更多資訊請關注PHP中文網其他相關文章!