1.模塊re
- 以一定規(guī)則,快速檢索文本,或是實現(xiàn)一些替換操作
- 默認(rèn)下,區(qū)分大小寫
2.常見的匹配字符表
字符 | 描述 |
---|---|
\d | 代表任意數(shù)字,就是阿拉伯?dāng)?shù)字 0-9 這些 |
\D |
代表非數(shù)字的字符。與\d完全相反 |
\w |
代表字母,數(shù)字,下劃線。也就是 a-z、A-Z、0-9、_ |
\W |
跟 \w 相反 ,代表不是字母,不是數(shù)字,不是下劃線的字符。 |
\n | 代表一個換行。 |
\r |
代表一個回車。 |
\f |
代表換頁。 |
\t |
代表一個 Tab 。 |
\s |
代表所有的空白字符,也就是上面這四個:\n、\r、\t、\f。 |
\S |
跟 \s 相反,代表所有不是空白的字符。 |
\A |
代表字符串的開始。 |
\Z |
代表字符串的結(jié)束。 |
^ | 匹配字符串開始的位置。 |
$ | 匹配字符創(chuàng)結(jié)束的位置。 |
. | 代表所有的單個字符,除了 \n \r |
[...] |
代表在 [] 范圍內(nèi)的字符,比如 [a-z] 就代表 a到z的字母 |
[^...] |
跟 [...] 唱反調(diào),代表不在 [] 范圍內(nèi)的字符 |
{n} |
匹配在 {n} 前面的東西,比如: o{2} 不能匹配 Bob 中的 o ,但是能匹配 food 中的兩個o。 |
{n,m} |
匹配在 {n,m} 前面的東西,比如:o{1,3} 將匹配fooooood 中的前三個o。 |
{n,} |
匹配在 {n,} 前面的東西,比如:o{2,} 不能匹配“Bob”中的“o”,但能匹配fooooood 中的所有o。 |
* |
和 {0,} 一個樣,匹配 * 前面的 0 次或多次。 比如 zo* 能匹配“z”、“zo”以及“zoo”。 |
+ |
和{1,} 一個樣,匹配 + 前面 1 次或多次。 比如 zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。 |
? |
和{0,1} 一個樣,匹配 ?前面 0 次或 1 次。 |
a|b | 匹配 a 或者 b。 |
() |
匹配括號里面的內(nèi)容。 |
a = 'C|C++|C#|Python|Java'
# 判斷字符串 a 中是否含有 Python
print(a.index('Python')>-1) # True
print('Python' in a) # True
import re
re.findall('Python', a) # 在字符串 a 中,找到所有的'Python'字符串
print(re.findall("Python", a)) # ['Python']
2.1/d /D
import re
a = 'C0C++1C#2Python3Java'
# 檢索所有數(shù)字
r = re.findall('\d', a) # \d 匹配所有數(shù)字 元字符的一種
print(r) # ['0', '1', '2', '3']
r = re.findall('\D', a) # \d 匹配所有非數(shù)字 元字符的一種
print(r) # ['0', '1', '2', '3']
# ['C', 'C', '+', '+', 'C', '#', 'P', 'y', 't', 'h', 'o', 'n', 'J', 'a', 'v', 'a']
2.2[] 表示或
# [] 表示或
import re
s = 'abc, acc, adc, aec, afc, ahc'
r = re.findall('a[cf]c', s) # 匹配中間是 c 或 f 的字符串
print(r) # ['acc', 'afc']
# [^] 表示否定
r = re.findall('a[^cf]c', s) # 匹配中間不是 c 和 f 的字符串
print(r) # ['abc', 'adc', 'aec', 'ahc']
# [c-f] 匹配c 到 f 的所有字符
r = re.findall('a[c-f]c', s) # 匹配 c 到 f 的字符
print(r) # ['acc', 'adc', 'aec', 'afc']
2.3\w \W
# 概括字符集
# \w \W
import re
a = 'C0C++\n1C# 2Python3*Java_'
r = re.findall('\w', a) # 匹配數(shù)字和字母 相當(dāng)于 [A-Za-z0-9_]
print(r)
# ['C', '0', 'C', '1', 'C', '2', 'P', 'y', 't', 'h', 'o', 'n', '3', 'J', 'a', 'v', 'a', '_']
r = re.findall('\W', a) # 非單詞字符
print(r) # ['+', '+', '\n', '#', ' ', '*']
# \s 空白字符
r = re.findall('\s', a)
print(r) # ['\n', ' ']
2.4{} 表示匹配次數(shù)
# 數(shù)量詞
# {4} 4 表示每次匹配次數(shù)
import re
a = 'python 11 java 22 php'
r = re.findall('[a-z]{3}', a)
print(r) # ['pyt', 'hon', 'jav', 'php']
# {3, 6} 表示匹配次數(shù)在 3到6 之間
r = re.findall('[a-z]{3,6}', a)
print(r) # ['python', 'java', 'php']
2.5貪婪 非貪婪
# 貪婪 非貪婪
# python 默認(rèn)為貪婪模式 盡可能 多匹配 和 多次匹配
# 非貪婪模式 表達(dá)式后面加 ? 匹配最少的次數(shù)
r = re.findall('[a-z]{3,6}?', a)
print(r) # ['pyt', 'hon', 'jav', 'php']
2.6* +
# * 匹配 0 次或者無限多次
a = 'pytho0python1pythonn2'
r = re.findall('python*', a) # 與 * 緊挨的字符n 匹配0次或是無限多次
print(r) # ['pytho', 'python', 'pythonn']
r = re.findall('pytho*', a) # 與 * 緊挨的字符n 匹配0次或是無限多次
print(r) # ['pytho', 'pytho', 'pytho']
r = re.findall('pythonn*', a) # 與 * 緊挨的字符n 匹配0次或是無限多次
print(r) # ['python', 'pythonn']
# + 匹配一次或無限多次
import re
r = re.findall('python+', a) # 與 * 緊挨的字符n 匹配1次或是無限多次
print(r) # ['python', 'pythonn']
# 不加 ?
r = re.findall('python{1,2}', a) # 匹配n 出現(xiàn)一次到兩次
print(r) # ['python', 'pythonn']
# 加了 ?
r = re.findall('python{1,2}?', a) # 匹配n 出現(xiàn)一次
print(r) # ['python', 'python']
2.7^ $ 邊界符
# 邊界匹配
import re
qq = '1000001'
r = re.findall('\d{4,8}', qq) # 匹配4 到8 位的QQ號
print(r) # ['1000001']
qq = '10000000001'
r = re.findall('\d{4,8}', qq) # 匹配4 到8 位的QQ號
print(r) # ['1000001'] 沒有達(dá)到目的
# ^ $ 邊界符
# ^ 規(guī)定以什么開始
# $ 規(guī)定以什么結(jié)束
r = re.findall('^\d{4,8}$', qq) # 匹配4 到8 位的QQ號
print(r) # [] 沒有匹配到
r = re.findall('^0000', qq) # 匹配從 0 開始的字符串
print(r) # [] 沒有匹配到
2.8() 分組
# () 一個括號對應(yīng)一組
import re
a = 'pythonpythonpythonJs'
r = re.findall('(python){3}(JS)', a)
print(r) # []
# re.I 不區(qū)分大小寫 第三個參數(shù)
r = re.findall('(python)(JS)', a, re.I)
print(r) # [('python', 'Js')]
# 接受多個第三個參數(shù)時,用|隔開
r = re.findall('(python)(JS)', a, re.I | re.S)
print(r) # [('python', 'Js')]
2.9. 匹配除換行符\n 以外的其他所有字符
# . 匹配出換行符\n 以外的其他所有字符
a = 'python\nCC'
r = re.findall('python.', a, re.I)
print(r) # [] 無法匹配\n
r = re.findall('python.', a, re.S) # 讓 . 可以匹配換行符
print(r) # ['python\n']
2.10re.sub 替換操作
# re.sub 替換操作
import re
language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#', 'GO', language)
print(r) # PythonGOJavaGOPHPGO
r = re.sub('C#', 'GO', language, 1)
print(r) # PythonGOJavaC#PHPC# 只替換了一個
r = re.sub('C#', 'GO', language, 0)
print(r) # PythonGOJavaGOPHPGO
# re.sub 的第二個參數(shù)可以是函數(shù)
def convert(value):
pass
r = re.sub('C#', convert, language)
print(r) # PythonJavaPHP
def conver(value):
matched = value.group()
return '!!' + matched + '!!'
r = re.sub('C#', convert, language)
print(r) # Python!!C#!!PHP!!C#!!
2.11將函數(shù)作為參數(shù)
# 將函數(shù)作為參數(shù)
import re
s = 'ABC37978D432'
def convert(value):
# 拿到具體數(shù)字
matched = value.group()
if matched >= 6:
return 9
else:
return 0
r = re.sub('\d', convert, s)
print(r) # ABC09999D000
2.12re.match re.search
# re.match
# re.search
# 都返回類對象
import re
s = 'ABC37978D432'
r = re.match('\d', s) # 從字符串的開始位置開始匹配,若不符,則返回None
print(r) # None
r = re.search('\d', s) # 在字符串中尋找可以匹配的
print(r) # <re.Match object; span=(3, 4), match='3'>
print(r.group()) # 3
print(r.span()) # (3, 4) 返回匹配的區(qū)間
2.13group 分組
# group 分組
# group() 默認(rèn)值為 0 返回正則的完整匹配結(jié)果
import re
s = 'life is short, i use python'
r = re.search('life.*python', s)
print(r.group()) # life is short, i use python
# () 進(jìn)行分組
r = re.search('(life.*python)', s)
print(r.group(0)) # life is short, i use python
# group(1)
r = re.search('life(.*)python', s)
print(r.group(1)) # is short, i use
r = re.findall('life(.*)python', s)
print(r) # is short, i use
s = 'life is short, i use python, i love python'
r = re.search('life(.*)python(.*)python', s)
print(r.group(0)) # life is short, i use python, i love python
print(r.group(1)) # is short, i use
print(r.group(2)) # , i love
print(r.group(0,1,2)) # ('life is short, i use python, i love python', ' is short, i use ', ', i love ')
print(r.groups()) # (' is short, i use ', ', i love ')
一些例子
正則表達(dá)式
import re
line = 'booooooooobbby123'
r = re.match(".*(b.*b).*", line)
print(r.group(1)) #貪婪模式下,檢索到最后符合的內(nèi)容
print(r.group(0))
r = re.match(".*?(b.*?b).*", line) #對 ? 后面的 檢索進(jìn)行非貪婪模式
print(r.group(1))
# +
print('~+~~~~~~~~~')
r = re.match(".*(b.+b)", line) #+ 前面內(nèi)容至少出現(xiàn)一次
print(r.group(1))
print('|||||')
r = re.match(".*(bbb|bby123)", line) # | 或關(guān)系 存在一個即可
print(r.group(1))
print('|||||')
r = re.match(".*(bby123|bbb)", line) # | 或關(guān)系 存在一個即可
print(r.group(1))
line2 = '15541861937'
regex_str = "(1[2345][0-9]{3})"
r = re.match(regex_str, line2)
print(r.group(0))
#漢字
print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = '你好嗎'
r = re.match("[\u4E00-\u9FA5]+", line)
print(r.group(0))
print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = '你 好嗎'
r = re.match("[\u4E00-\u9FA5]+", line)
print(r.group(0))
print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = 'study in 北京大學(xué)'
r = re.match(".*([\u4E00-\u9FA5]+大學(xué))", line)
print(r.group(1))
print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = 'study in 北京大學(xué)'
r = re.match(".*?([\u4E00-\u9FA5]+大學(xué))", line)
print(r.group(1))
line = 'XXX出生于2001年6月'
line = 'XXX出生于2001/6/1'
line = 'XXX出生于2001-6-1'
line = 'XXX出生于2001-06-01'
line = 'XXX出生于2001-06'
regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"
文章來源地址http://www.zghlxwxcb.cn/news/detail-583252.html
文章來源:http://www.zghlxwxcb.cn/news/detail-583252.html
到了這里,關(guān)于python筆記:第十一章正則表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!