字串是程式設計時涉及到的最多的一種資料結構,對字串進行操作的需求幾乎無所不在。例如判斷一個字串是否是合法的Email地址,雖然可以編程提取@前後的子串,再分別判斷是否是單字和域名,但這樣做不但麻煩,而且代碼難以復用。正規表示式是一種用來匹配字串的強而有力的武器。它的設計思想是用一種描述性的語言來為字串定義一個規則,凡是符合規則的字串,我們就認為它「匹配」了,否則,該字串就是不合法的。
所以我們判斷字串是否是合法的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'>>> import re >>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345') <_sre.SRE_Match object; span=(0, 9), match='010-12345' >>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345') >>>match( )方法判斷是否匹配,如果匹配成功,返回Match對象,否則返回None。常見的判斷方法是:test = '使用者輸入的字串'if re.match(r'正規表示式', test):
print('ok')else: print('failed')##切分字串
用正規表示式切分字串比用固定的字元更靈活,請看正常的切分代碼:
>>> 'a b c'.split(' ') ['a', 'b', '', '', 'c']
嗯,無法辨識連續的空格,用正規表示式試試:
>>> re.split(r'\s+', 'a b c') ['a', 'b', 'c']
無論多少個空格都可以正常分割。加入,試試:
>>> re.split(r'[\s\,]+', 'a,b, c d') ['a', 'b', 'c', 'd']
再加入;試試看:
>>> re.split(r'[\s\,\;]+', 'a,b;; c d') ['a', 'b', 'c', 'd']
如果使用者輸入了一組標籤,下次記得用正規表示式來把不規範的輸入轉換成正確的數組。
分組# 除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如: ^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码: 如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。 注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。 提取子串非常有用。来看一个更凶残的例子: 这个正则表达式可以直接识别合法的时间。但是有些时候,用正则表达式也无法做到完全验证,比如识别日期: 对于'2-30','4-31'这样的非法日期,用正则还是识别不了,或者说写出来非常困难,这时就需要程序配合识别了。 贪婪匹配 最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0: 由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。 必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配: 编译 当我们在Python中使用正则表达式时,re模块内部会干两件事情: 编译正则表达式,如果正则表达式的字符串本身不合法,会报错; 用编译后的正则表达式去匹配字符串。 如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配: 编译后生成Regular Expression对象,由于该对象自己包含了正则表达式,所以调用对应的方法时不用给出正则字符串。 参数 修饰符 模式>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'
>>>> m.group(0)'010-12345'
>>> m.group(1)'010'
>>> m.group(2)'12345'
>>> t = '19:05:30'
>>> m = re.match(r'^(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])$', t)>>> m.groups()
('19', '05', '30')
'^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$'
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
>>> import re
# 编译:
>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用:
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-8086').groups()
('010', '8086')
以上是python如何使用正規表示式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

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

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

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

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能