正則表達式(Regular Expression,在代碼中常簡寫為regex、regexp或RE),是計算機科學(xué)的一個概念。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。
在Python中需要通過正則表達式對字符串進行匹配的時候,可以使用re模塊。
re模塊
# re.match(正則表達式,要匹配的字符串)
- re.match是用來進行正則匹配檢查的方法,若字符串匹配正則表達式,則match方法返回匹配對象(Match Object),否則返回None(注意不是空字符串"")。
- 匹配對象Macth Object具有g(shù)roup方法,用來返回字符串的匹配部分。
# re.match() 能夠匹配出以xxx開頭的字符串
result = re.match('hello','helloworld')
# 使用match方法進行匹配操作
# 如果上一步匹配到數(shù)據(jù)的話,可以使用group方法來提取數(shù)據(jù)
print(result.group())
匹配單字符
| 字符 | 功能 |
|---|---|
| . | 匹配任意1個字符(除了\n) |
| [ ] | 匹配[ ]中列舉的字符 |
| \d | 匹配數(shù)字,即0-9 |
| \D | 匹配非數(shù)字,即不是數(shù)字 |
| \s | 匹配空白,即 空格,tab鍵 |
| \S | 匹配非空白 |
| \w | 匹配單詞字符,即a-z、A-Z、0-9、_ |
| \W | 匹配非單詞字符 |
原始字符串
使用原始字符串解決正則表達式需要匹配的文本包含轉(zhuǎn)義字符“\”的問題。原始字符串是在字符串前加上r。
mm = "c:\\a\\b\\c"
ret = re.match(r"c:\\a",mm).group()
print(ret)
匹配多個字符
| 字符 | 功能 |
|---|---|
| * | 匹配前一個字符出現(xiàn)0次或者無限次,即可有可無 |
| + | 匹配前一個字符出現(xiàn)1次或者無限次,即至少有1次 |
| ? | 匹配前一個字符出現(xiàn)1次或者0次,即要么有1次,要么沒有 |
| {m} | 匹配前一個字符出現(xiàn)m次 |
| {m,} | 匹配前一個字符至少出現(xiàn)m次 |
| {m,n} | 匹配前一個字符出現(xiàn)從m到n次 |
示例
[A-Z][a-z]* 匹配首字母大寫后面都是小寫字母并且這些小寫字母可有可無
[a-zA-Z_]+[\w_]* 匹配變量名是否有效
[1-9]?[0-9] 匹配0到99之間的數(shù)字
[a-zA-Z0-9_]{8,20} 匹配8到20位的密碼,可以是大小寫英文字母、數(shù)字、下劃線
匹配邊界
| 字符 | 功能 |
|---|---|
| ^ | 匹配字符串開頭 |
| $ | 匹配字符串結(jié)尾 |
| \b | 匹配一個單詞的邊界 |
| \B | 匹配非單詞邊界 |
匹配分組
| 字符 | 功能 |
|---|---|
| 匹配左右任意一個表達式 | |
| (ab) | 將括號中字符作為一個分組 |
| \num | 引用分組num匹配到的字符串 |
| (?P<name>) | 分組起別名 |
| (?P=name) | 引用別名為name分組匹配到的字符串 |
re模塊中常用函數(shù)
| 函數(shù) | 說明 |
|---|---|
| compile() | 根據(jù)包含正則表達式的字符串創(chuàng)建模式對象 |
| search() | 在字符串中尋找模式 |
| match() | 在字符串的開始處匹配模式 |
| split() | 根據(jù)模式的匹配項來分割字符串 |
| findall() | 列出字符串中模式的所有匹配項 |
| sub(pat,repl,string[,count=0]) | 將字符串中的所有pat的匹配項用repl替換 |
| escape() | 將字符串中所有特殊正則表達式字符轉(zhuǎn)義 |
import re
pat = r'\d+'
string = '人民幣100萬'
print(re.search(pat, string).group())
if re.search(pat, string):
print('found it')
some_text = 'alpha.beta...game'
print(re.split('[.]+', some_text))
pat1 = '[a-zA-Z]+'
text = 'Hm...are you sure?'
print(re.findall(pat1, text))
pat2 = '{name}'
text1 = 'Dear {name}...'
print(re.sub(pat2, 'xiaoli',text1))
print(re.escape('www.python.org'))
print(re.escape('hello world'))
結(jié)果
100
found it
['alpha', 'beta', 'game']
['Hm', 'are', 'you', 'sure']
Dear xiaoli...
www\.python\.org
hello\ world