java 正则首位8或者9的8位数字_从零开始学Python - 第025课:正则表达式的应用
正則表達式相關知識
在編寫處理字符串的程時,經常會遇到在一段文本中查找符合某些規則的字符串的需求,正則表達式就是用于描述這些規則的工具,換句話說,我們可以使用正則表達式來定義字符串的匹配模式,即如何檢查一個字符串是否有跟某種模式匹配的部分或者從一個字符串中將與模式匹配的部分提取出來或者替換掉。
舉一個簡單的例子,如果你在Windows操作系統中使用過文件查找并且在指定文件名時使用過通配符(*和?),那么正則表達式也是與之類似的用 來進行文本匹配的工具,只不過比起通配符正則表達式更強大,它能更精確地描述你的需求,當然你付出的代價是書寫一個正則表達式比使用通配符要復雜得多,因為任何給你帶來好處的東西都需要你付出對應的代價。
再舉一個例子,我們從某個地方(可能是一個文本文件,也可能是網絡上的一則新聞)獲得了一個字符串,希望在字符串中找出手機號和座機號。當然我們可以設定手機號是11位的數字(注意并不是隨機的11位數字,因為你沒有見過“25012345678”這樣的手機號),而座機號則是類似于“區號-號碼”這樣的模式,如果不使用正則表達式要完成這個任務就會比較麻煩。最初計算機是為了做數學運算而誕生的,處理的信息基本上都是數值,而今天我們在日常工作中處理的信息基本上都是文本數據,我們希望計算機能夠識別和處理符合某些模式的文本,正則表達式就顯得非常重要了。今天幾乎所有的編程語言都提供了對正則表達式操作的支持,Python通過標準庫中的re模塊來支持正則表達式操作。
關于正則表達式的相關知識,大家可以閱讀一篇非常有名的博文叫《正則表達式30分鐘入門教程》,讀完這篇文章后你就可以看懂下面的表格,這是我們對正則表達式中的一些基本符號進行的扼要總結。
說明: 如果需要匹配的字符是正則表達式中的特殊字符,那么可以使用進行轉義處理,例如想匹配小數點可以寫成.就可以了,因為直接寫.會匹配任意字符;同理,想匹配圓括號必須寫成(和),否則圓括號被視為正則表達式中的分組。Python對正則表達式的支持
Python提供了re模塊來支持正則表達式相關操作,下面是re模塊中的核心函數。
說明: 上面提到的re模塊中的這些函數,實際開發中也可以用正則表達式對象的方法替代對這些函數的使用,如果一個正則表達式需要重復的使用,那么先通過compile函數編譯正則表達式并創建出正則表達式對象無疑是更為明智的選擇。下面我們通過一系列的例子來告訴大家在Python中如何使用正則表達式。
例子1:驗證輸入用戶名和QQ號是否有效并給出對應的提示信息。
""" 要求:用戶名必須由字母、數字或下劃線構成且長度在6~20個字符之間,QQ號是5~12的數字且首位不能為0 """ import reusername = input('請輸入用戶名: ') qq = input('請輸入QQ號: ') # match函數的第一個參數是正則表達式字符串或正則表達式對象 # match函數的第二個參數是要跟正則表達式做匹配的字符串對象 m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username) if not m1:print('請輸入有效的用戶名.') # fullmatch函數要求字符串和正則表達式完全匹配 # 所以正則表達式沒有寫起始符和結束符 m2 = re.fullmatch(r'[1-9]d{4,11}', qq) if not m2:print('請輸入有效的QQ號.') if m1 and m2:print('你輸入的信息是有效的!')提示: 上面在書寫正則表達式時使用了“原始字符串”的寫法(在字符串前面加上了r),所謂“原始字符串”就是字符串中的每個字符都是它原始的意義,說得更直接一點就是字符串中沒有所謂的轉義字符啦。因為正則表達式中有很多元字符和需要進行轉義的地方,如果不使用原始字符串就需要將反斜杠寫作,例如表示數字的d得書寫成d,這樣不僅寫起來不方便,閱讀的時候也會很吃力。例子2:從一段文字中提取出國內手機號碼。
下面這張圖是截止到2017年底,國內三家運營商推出的手機號段。
import re# 創建正則表達式對象,使用了前瞻和回顧來保證手機號前后不應該再出現數字 pattern = re.compile(r'(?<=D)1[34578]d{9}(?=D)') sentence = '''重要的事情說8130123456789遍,我的手機號是13512346789這個靚號, 不是15600998765,也是110或119,王大錘的手機號才是15600998765。''' # 方法一:查找所有匹配并保存到一個列表中 tels_list = re.findall(pattern, sentence) for tel in tels_list:print(tel) print('--------華麗的分隔線--------')# 方法二:通過迭代器取出匹配對象并獲得匹配的內容 for temp in pattern.finditer(sentence):print(temp.group()) print('--------華麗的分隔線--------')# 方法三:通過search函數指定搜索位置找出所有匹配 m = pattern.search(sentence) while m:print(m.group())m = pattern.search(sentence, m.end())說明: 上面匹配國內手機號的正則表達式并不夠好,因為像14開頭的號碼只有145或147,而上面的正則表達式并沒有考慮這種情況,要匹配國內手機號,更好的正則表達式的寫法是:(?<=D)(1[38]d{9}|14[57]d{8}|15[0-35-9]d{8}|17[678]d{8})(?=D),國內好像已經有19和16開頭的手機號了,但是這個暫時不在我們考慮之列。例子3:替換字符串中的不良內容
import resentence = 'Oh, shit! 你丫是傻叉嗎? Fuck you.' purified = re.sub('fuck|shit|[傻煞沙][比屄逼叉缺吊屌碉雕]','*', sentence, flags=re.IGNORECASE) print(purified) # Oh, *! 你丫是*嗎? * you.說明:re模塊的正則表達式相關函數中都有一個flags參數,它代表了正則表達式的匹配標記,可以通過該標記來指定匹配時是否忽略大小寫、是否進行多行匹配、是否顯示調試信息等。如果需要為flags參數指定多個值,可以使用按位或運算符進行疊加,如flags=re.I | re.M。例子4:拆分長字符串
import repoem = '窗前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。' sentences_list = re.split(r'[,。, .]', poem) sentences_list = [sentence for sentence in sentences_list if sentence] for sentence in sentences_list:print(sentence)簡單的總結
正則表達式在字符串的處理和匹配上真的非常強大,通過上面的例子相信大家已經感受到了正則表達式的魅力,當然寫一個正則表達式對新手來說并不是那么容易,但是很多事情都是熟能生巧,大膽的去嘗試就行了,有一個在線的正則表達式測試工具相信能夠在一定程度上幫到大家。
溫馨提示:大家如果覺得這個專欄還不錯,一定記得點贊收藏喲!總結
以上是生活随笔為你收集整理的java 正则首位8或者9的8位数字_从零开始学Python - 第025课:正则表达式的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php+jquery实现图片上传预览_和
- 下一篇: python 内存_一行Python解决