正則式(經常使用匹配,非貪婪,修飾符,re庫函數)

1、經常使用的匹配規則總結:html

模式 描述
\w 匹配字母數字及下劃線
\W 匹配非字母數字及下劃線
\s 匹配任意空白字符,等價於 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意數字,等價於 [0-9]
\D 匹配任意非數字
\A 匹配字符串開始
\Z 匹配字符串結束,若是是存在換行,只匹配到換行前的結束字符串
\z 匹配字符串結束
\G 匹配最後匹配完成的位置
\n 匹配一個換行符
\t 匹配一個製表符
^ 匹配字符串的開頭
$ 匹配字符串的末尾
. 匹配任意字符,除了換行符,當 re.DOTALL 標記被指定時,則能夠匹配包括換行符的任意字符
[...] 用來表示一組字符,單獨列出:[amk] 匹配 'a','m' 或 'k'
[^...] 不在 [] 中的字符:匹配除了 a,b,c 以外的字符。
* 匹配 0 個或多個的表達式。
+ 匹配 1 個或多個的表達式。
? 匹配 0 個或 1 個由前面的正則表達式定義的片斷,非貪婪方式
{n} 精確匹配 n 個前面表達式。
{n, m} 匹配 n 到 m 次由前面的正則表達式定義的片斷,貪婪方式
a | b 匹配 a 或 b(中間是分隔符)
( ) 匹配括號內的表達式,也表示一個組

2、萬能匹配符號python

.(點)能夠匹配任意字符(除換行符),*(星) 又表明匹配前面的字符無限次,因此它們組合在一塊兒 .* 就能夠匹配任意的字符了,有了它咱們就不用挨個字符地匹配了。git

貪婪匹配:.*    能夠匹配任意多的字符,在正常它會盡可能多地匹配字符,以下實例:web

import re

content = 'Hello 1234567 World_This is a Regex Demo'

result = re.match('^He.*(\d+).*Demo$', content)

print(result.group(1))

# 結果是 7
#匹配式'^He.*(\d+).*Demo$' 中.*(貪婪匹配)能夠儘可能多地匹配到llo 123456 而正則式仍成立的
複製代碼

**非貪婪的匹配:**這時要想獲得一個非貪婪的匹配,能夠獲得1234567,能夠用.*? 爲非貪婪匹配模式。實例以下:正則表達式

import re

content = 'Hello 1234567 World_This is a Regex Demo'

result = re.match('^He.*?(\d+).*Demo$', content)

print(result.group(1))

# 結果是 1234567

複製代碼

貪婪匹配是儘量匹配多的字符,非貪婪匹配就是儘量匹配少的字符.*? 以後是 \d+ 用來匹配數字,當 .*?匹配到 Hello 後面的空白字符的時候,再日後的字符就是數字了,而 \d+ 剛好能夠匹配,那麼這裏.*?就再也不進行匹配,交給 \d+ 去匹配後面的數字。因此.*?匹配了儘量少的字符,\d+ 的結果就是 1234567 。bash

3、修飾符ide

修飾符 描述

re.I 使匹配對大小寫不敏感

re.L 作本地化識別(locale-aware)匹配

re.M 多行匹配,影響 ^ 和 $

re.S 使 . 匹配包括換行在內的全部字符

re.U 根據Unicode字符集解析字符。這個標誌影響 \w, \W, \b, \B.

re.X 該標誌經過給予你更靈活的格式以便你將正則表達式寫得更易於理解。

在網頁匹配中較爲經常使用的爲 re.S、re.I。

複製代碼

實例:函數

import re

content = '''Hello 1234567 World_This is a Regex Demo '''

result = re.match('^He.*?(\d+).*?Demo$', content)

print(result.group(1))

#運行結果:AttributeError: 'NoneType' object has no attribute 'group',沒有捕獲括號內的值

複製代碼

由於需求匹配的文本content有換行符(有換行),而. 匹配的是換行符之外的任意字符,故匹配失敗。那麼在這裏咱們只須要加一個修飾符 re.S,便可修正這個錯誤。測試

result = re.match('^He.*?(\d+).*?Demo$', content, re.S)

#運行結果:1234567
#在 match() 方法的第三個參數傳入 re.S,它的做用是使 . 匹配包括換行符在內的全部字符。
複製代碼

4、re庫函數ui

  • re.match():從字符串的開頭開始匹配,匹配到相符的;
import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'

result = re.match('Hello.*?(\d+).*?Demo', content)

print(result)

#運行結果 None

複製代碼
  • re.search():匹配時會掃描整個字符串,而後返回第一個成功匹配的結果;
import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'

result = re.search('Hello.*?(\d+).*?Demo', content)

print(result)

#運行結果 <_sre.SRE_Match object; span=(13, 53), match='Hello 1234567 World_This is a Regex Demo'>

複製代碼
  • re.findall():匹配時會掃描整個字符串,而後返回匹配正則表達式的全部內容;

  • re.sub():匹配到整個字符串符合的內容,並作替換;

import re

content = '54aK54yr5oiR54ix5L2g'

content = re.sub('\d+', '', content)

print(content)

#結果:aKyroiRixLg
#re.sub(‘正則式’,‘替換內容’,驗證的文本)
複製代碼
  • re.compile():將正則字符串編譯成正則表達式對象,以便於在後面的匹配中複用;
import re

content1 = '2016-12-15 12:00'

content2 = '2016-12-17 12:55'

content3 = '2016-12-22 13:21'

pattern = re.compile('\d{2}:\d{2}')

result1 = re.sub(pattern, '', content1)

result2 = re.sub(pattern, '', content2)

result3 = re.sub(pattern, '', content3)

print(result1, result2, result3)

#運行結果:2016-12-15  2016-12-17  2016-12-22

#將正則字符串編譯成正則表達式對象pattern,後面直接調用pattern

複製代碼

參考資料:

正則表達式: [germey.gitbooks.io/python3webs…]

在線正則表達式測試:tool.oschina.net/regex/#

相關文章
相關標籤/搜索