搜尋
首頁後端開發Python教學python如何使用正規表示式

python如何使用正規表示式

Jun 22, 2019 pm 01:18 PM
python正規表示式

字串是程式設計時涉及到的最多的一種資料結構,對字串進行操作的需求幾乎無所不在。例如判斷一個字串是否是合法的Email地址,雖然可以編程提取@前後的子串,再分別判斷是否是單字和域名,但這樣做不但麻煩,而且代碼難以復用。正規表示式是一種用來匹配字串的強而有力的武器。它的設計思想是用一種描述性的語言來為字串定義一個規則,凡是符合規則的字串,我們就認為它「匹配」了,否則,該字串就是不合法的。

python如何使用正規表示式

所以我們判斷字串是否是合法的Email的方法是:

建立一個符合Email的正規表示式;

用該正規表示式去匹配使用者的輸入來判斷是否合法。

因為正規表示式也是用字串表示的,所以,我們要先了解如何用字元來描述字元。

在正規表示式中,如果直接給出字符,就是精確匹配。用\d可以匹配一個數字,\w可以匹配一個字母或數字,所以:

'00\d'可以匹配'007',但無法匹配'00A';

##' \d\d\d'可以匹配'010';

'\w\w\d'可以匹配'py3';

.可以匹配任意字符,所以:

'py.'可以符合'pyc'、'pyo'、'py!'等等。

要匹配變長的字符,在正規表示式中,用*表示任意個字符(包括0個),用表示至少一個字符,用?表示0個或1個字符,用{n }表示n個字符,用{n,m}表示n-m個字符:

來看一個複雜的例子:\d{3}\s \d{3,8}。

我們來從左到右解讀一下:

\d{3}表示符合3個數字,例如'010';

\s可以符合一個空格(也包括Tab等空白符),所以\s 表示至少有一個空格,例如匹配' ',' '等;

\d{3,8}表示3-8個數字,例如'1234567' 。

綜合起來,上面的正規表示式可以符合以任一空格隔開的帶區號的電話號碼。

如果要符合'010-12345'這樣的號碼呢?由於'-'是特殊字符,在正規表示式中,要用'\'轉義,所以,上面的正則是\d{3}\-\d{3,8}。

但是,仍然無法匹配'010 - 12345',因為帶有空格。所以我們需要更複雜的配對方式。

相關推薦:《

Python影片教學

進階

要做更精確地匹配,可以用[ ]表示範圍,例如:

[0-9a-zA-Z\_]可以符合一個數字、字母或底線;

[0-9a-zA-Z\_] 可以符合至少由一個數字、字母或底線組成的字串,例如'a100','0_Z','Py3000'等等;

[a-zA-Z\_][0-9a-zA -Z\_]*可以符合由字母或底線開頭,後接任意個由一個數字、字母或底線組成的字串,也就是Python合法的變數;

[a-zA-Z\ _][0-9a-zA-Z\_]{0, 19}更精確地限制了變數的長度是1-20個字元(前面1個字元後面最多19個字元)。

A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或'python'。

^表示行的開頭,^\d表示必須以數字開頭。

$表示行的結束,\d$表示必須以數字結束。

你可能注意到了,py也可以匹配'python',但是加上^py$就變成了整行匹配,就只能匹配'py'了。

re模組

有了準備知識,我們就可以在Python中使用正規表示式了。 Python提供re模組,包含所有正規表示式的功能。由於Python的字串本身也用\轉義,所以要特別注意:

s = 'ABC\\-001' # Python的字串# 對應的正規表示式字串變成:# ' ABC\-001'


因此我們強烈建議使用Python的r前綴,就不用考慮轉義的問題了:

s = r'ABC\-001' # Python的字串# 對應的正規表示式字串不變:# 'ABC\-001'


#先看看如何判斷正規表示式是否符合:

>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match=&#39;010-12345&#39;
>>>> re.match(r&#39;^\d{3}\-\d{3,8}$&#39;, &#39;010 12345&#39;)
>>>

match( )方法判斷是否匹配,如果匹配成功,返回Match對象,否則返回None。常見的判斷方法是:

test = '使用者輸入的字串'if re.match(r'正規表示式', test):


print(&#39;ok&#39;)else:
print(&#39;failed&#39;)

##切分字串

用正規表示式切分字串比用固定的字元更靈活,請看正常的切分代碼:

>>> &#39;a b   c&#39;.split(&#39; &#39;)
[&#39;a&#39;, &#39;b&#39;, &#39;&#39;, &#39;&#39;, &#39;c&#39;]

嗯,無法辨識連續的空格,用正規表示式試試:

>>> re.split(r&#39;\s+&#39;, &#39;a b   c&#39;)
[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]

無論多少個空格都可以正常分割。加入,試試:

>>> re.split(r&#39;[\s\,]+&#39;, &#39;a,b, c  d&#39;)
[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]

再加入;試試看:

>>> re.split(r&#39;[\s\,\;]+&#39;, &#39;a,b;; c  d&#39;)
[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]

如果使用者輸入了一組標籤,下次記得用正規表示式來把不規範的輸入轉換成正確的數組。

分組

#

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:

^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:

>>> m = re.match(r&#39;^(\d{3})-(\d{3,8})$&#39;, &#39;010-12345&#39;)
>>> m
<_sre.SRE_Match object; span=(0, 9), match=&#39;010-12345&#39;
>>>> m.group(0)&#39;010-12345&#39;
>>> m.group(1)&#39;010&#39;
>>> m.group(2)&#39;12345&#39;

如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。

注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。

提取子串非常有用。来看一个更凶残的例子:

>>> t = &#39;19:05:30&#39;
>>> m = re.match(r&#39;^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$&#39;, t)>>> m.groups()
(&#39;19&#39;, &#39;05&#39;, &#39;30&#39;)

这个正则表达式可以直接识别合法的时间。但是有些时候,用正则表达式也无法做到完全验证,比如识别日期:

&#39;^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$&#39;

对于'2-30','4-31'这样的非法日期,用正则还是识别不了,或者说写出来非常困难,这时就需要程序配合识别了。

贪婪匹配

最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:

>>> re.match(r&#39;^(\d+)(0*)$&#39;, &#39;102300&#39;).groups()
(&#39;102300&#39;, &#39;&#39;)

由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

>>> re.match(r&#39;^(\d+?)(0*)$&#39;, &#39;102300&#39;).groups()
(&#39;1023&#39;, &#39;00&#39;)

编译

当我们在Python中使用正则表达式时,re模块内部会干两件事情:

编译正则表达式,如果正则表达式的字符串本身不合法,会报错;

用编译后的正则表达式去匹配字符串。

如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:

>>> import re
# 编译:
>>> re_telephone = re.compile(r&#39;^(\d{3})-(\d{3,8})$&#39;)
# 使用:
>>> re_telephone.match(&#39;010-12345&#39;).groups()
(&#39;010&#39;, &#39;12345&#39;)
>>> re_telephone.match(&#39;010-8086&#39;).groups()
(&#39;010&#39;, &#39;8086&#39;)

编译后生成Regular Expression对象,由于该对象自己包含了正则表达式,所以调用对应的方法时不用给出正则字符串。

参数

python如何使用正規表示式

修饰符

python如何使用正規表示式

模式

python如何使用正規表示式

python如何使用正規表示式

以上是python如何使用正規表示式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python和時間:充分利用您的學習時間Python和時間:充分利用您的學習時間Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python:遊戲,Guis等Python:遊戲,Guis等Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python vs.C:申請和用例Python vs.C:申請和用例Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時的Python計劃:一種現實的方法2小時的Python計劃:一種現實的方法Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能