python import re_Python标准库笔记(2) — re模块
re模塊提供了一系列功能強大的正則表達式(regular expression)工具,它們允許你快速檢查給定字符串是否與給定的模式匹配(match函數), 或者包含這個模式(search函數)。正則表達式是以緊湊(也很神秘)的語法寫出的字符串模式。
Python版本: 2.x
1、模塊方法
2、匹配語法
正則表達式適用于所有編程語言,并不是Python特有的,下面的語法介紹來自于這位博
主的歸納:
3、方法使用re.match(pattern, string, flags=0)
從字符串的開始匹配,如果pattern匹配到就返回一個Match對象實例(Match對象在后面描述),否則放回None。flags為匹配模式(會在下面描述),用于控制正則表達式的匹配方式。
import re
a = 'abcdefg'
print re.match(r'abc', a) # 匹配成功
print re.match(r'abc', a).group()
print re.match(r'cde', a) # 匹配失敗
>>><_sre.SRE_Match object at 0x0000000001D94578>
>>>abc
>>>None
search(pattern, string, flags=0)
用于查找字符串中可以匹配的子串,如果找到就返回對應的Match對象實例,否則返回None。它和math的區別是math只匹配開頭。
import re
a = 'abcdefg'
print re.search(r'bc', a)
print re.search(r'bc', a).group()
print re.search(r'123', a)
>>><_sre.SRE_Match object at 0x0000000001D94578>
>>>bc
>>>None
sub(pattern, repl, string, count=0, flags=0)
跟sub()函數一樣,只是它返回的是一個元組,包含新字符串和匹配到的次數。
import re
a = 'a1b2c3'
print re.subn(r'\d+', '0', a) # 將數字替換成'0'
>>>('a0b0c0', 3)
split(pattern, string, maxsplit=0, flags=0)
升級版的split(),用pattern匹配的子串來分割string,如果pattern里使用了圓括號,那么被pattern匹配到的串也將作為返回值列表的一部分,maxsplit為最多被分割的字符串個數。
import re
a = 'a1b2c'
print re.split(r'\d', a)
print re.split(r'(\d)', a)
>>>['a', 'b', 'c']
>>>['a', '1', 'b', '2', 'c']
findall(pattern, string, flags=0)
以列表的形式返回string里pattern匹配的子串。
import re
a = 'a1b2c3d4'
print re.findall('\d', a)
>>>['1', '2', '3', '4']
4、Match對象
re.match()、re.search()成功匹配的話都會返回一個Match對象,它包含了關于此次匹配的信息,可以使用Match提供的屬性或方法來獲取這些信息。例如:
import re
m = re.match(r'(\w+) (\w+)(?P.*)', 'hello world!')
print "m.string:", m.string
print "m.re:", m.re
print "m.pos:", m.pos
print "m.endpos:", m.endpos
print "m.lastindex:", m.lastindex
print "m.lastgroup:", m.lastgroup
print "m.group(1,2):", m.group(1, 2)
print "m.groups():", m.groups()
print "m.groupdict():", m.groupdict()
print "m.start(2):", m.start(2)
print "m.end(2):", m.end(2)
print "m.span(2):", m.span(2)
print r"m.expand(r'\2 \1\3'):", m.expand(r'\2 \1\3')
### output ###
# m.string: hello world!
# m.re: <_sre.SRE_Pattern object at 0x016E1A38>
# m.pos: 0
# m.endpos: 12
# m.lastindex: 3
# m.lastgroup: sign
# m.group(1,2): ('hello', 'world')
# m.groups(): ('hello', 'world', '!')
# m.groupdict(): {'sign': '!'}
# m.start(2): 6
# m.end(2): 11
# m.span(2): (6, 11)
# m.expand(r'\2 \1\3'): world hello!
5、Pattern對象
Pattern對象對象由re.compile()生成,它帶有許多re模塊的同名方法,而且方法用處也是一樣的。例如:
>>>import re
>>>pa = re.compile('(d\+)')
>>>print pa.split('he has 2 books and 1 pen')
['he has ', '2', ' books and ', '1', ' pen']
>>>print pa.findall('he has 2 books and 1 pen')
['2', '1']
>>>print pa.sub('much', 'he has 2 books and 1 pen')
he has much books and much pen
6、匹配模式
匹配模式取值可以使用按位或運算符'|'表示同時生效,比如re.I | re.M, 下面是常見的一些flag。re.I(re.IGNORECASE): 忽略大小寫
>>pa = re.compile('abc', re.I)
>>>pa.findall('AbCdEfG')
>>>['AbC']
re.L(re.LOCALE):字符集本地化
這個功能是為了支持多語言版本的字符集使用環境的,比如在轉義符\w,在英文環境下,它代表[a-zA-Z0-9],即所以英文字符和數字。如果在一個法語環境下使用,有些法語字符串便匹配不上。加上這L選項和就可以匹配了。不過這個對于中文環境沒有什么用,它仍然不能匹配中文字符。
re.M(re.MULTILINE): 多行模式,改變'^'和'$'的行為
>>>pa = re.compile('^\d+')
>>>pa.findall('123 456\n789 012\n345 678')
>>>['123']
>>>pa_m = re.compile('^\d+', re.M)
>>>pa_m.findall('123 456\n789 012\n345 678')
>>>['123', '789', '345']
re.S(re.DOTALL): 點任意匹配模式,改變'.'的行為
點號將匹配所有的字符。缺省情況下.匹配除換行符\n外的所有字符,使用這一選項以后,點號就能匹配包括換行符的任何字符。
re.U(re.UNICODE): 根據Unicode字符集解析字符
re.X(re.VERBOSE): 詳細模式
# 這個模式下正則表達式可以是多行,忽略空白字符,并可以加入注釋。以下兩個正則表達式是等價的
a = re.compile(r"""\d + # the integral part\. # the decimal point\d * # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")
# 但是在這個模式下,如果你想匹配一個空格,你必須用'/ '的形式('/'后面跟一個空格)
總結
以上是生活随笔為你收集整理的python import re_Python标准库笔记(2) — re模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python表格对齐_python st
- 下一篇: 深入浅出 Javascript API(