正则表达式(python)
正则语法
匹配语法
匹配实例
实例 描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符类
[^0-9] 匹配除了数字外的字符类
^[0-9] 匹配以数字开头的字符类
[0-9]$ 匹配结尾为数字的字符类
[0-27-7] 表示0 ,1, 2, 5, 6, 7 几个字符组成的字符类
贪婪 懒惰
import re
m = re.search(r'\d{6,8}' , '87654321' )
print(m)
m = re.search(r'\d{5,8}?' , '87654321' )
print(m)
分组
import re
p = r'(\d{3,4})-(\d{7,8})'
m = re.search(p, '010-87654321' )
print(m)
print(m.group())
print(m.group(1 ))
print(m.group(2 ))
print(m.groups())
命名分组
import re
p = r'(?P<area_code>\d{3,4})-(?P<phone_code>\d{7,8})'
m = re.search(p, '010-87654321' )
print(m)
print(m.group())
print(m.group(1 ))
print(m.group(2 ))
print(m.groups())
print(m.group('area_code' ))
print(m.group('phone_code' ))
反向引用
import re
p = r'<(\w+)>.*</(\w+)>'
m = re.search(p, '<a>abc</a>' )
print(m)
m = re.search(p, '<a>abc</b>' )
print(m)
p = r'<(\w+)>.*</\1>'
m = re.search(p, '<a>abc</a>' )
print(m)
m = re.search(p, '<a>abc</b>' )
print(m)
非捕获分组
import re
s = 'img1.jpg, img2.jpg, img3.bmp'
p = r'\w+(\.jpg)'
m = re.findall(p, s)
print(m)
p = r'\w+(?:\.jpg)'
m = re.findall(p, s)
print(m)
字符串分割
split(pattern, string, maxsplit=0, flags=0)
import re
p = r'\d+'
text = 'as34d5ff55r'
c_list = re.split(p, text)
print(c_list)
c_list = re.split(p, text, maxsplit=1 )
print(c_list)
c_list = re.split(p, text, maxsplit=2 )
print(c_list)
字符串替换
re.sub(pattern, repl, string, count=0, flags=0)
替换字符串中的匹配项
import re
p = r'\d+'
text = 'as34d5ff55r'
c_list = re.sub(p, '' , text)
print(c_list)
c_list = re.sub(p, '' , text, count=1 )
print(c_list)
c_list = re.sub(p, '' , text, count=2 )
print(c_list)
re.match re.search 的用法
re.search(pattern, string, flags=0)
扫描整个字符串并返回第一个成功的匹配re.match(pattern, string, flags=0)
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
import re
print(re.match(r'www' , 'www.runoob.com' ).span())
print(re.match(r'com' , 'www.runoob.com' ))
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*' , line, re.M | re.I)
print("matchObj.group() : " , matchObj.group())
print("matchObj.group(1) : " , matchObj.group(1 ))
print("matchObj.group(2) : " , matchObj.group(2 ))
re.findall的用法
re.findall(self, path, namespaces=None)
以列表形式返回全部能匹配的子串
import re
p = re.compile(r'\d+' )
print (p.findall('one1two2three3four4' ))
re.finditer的用法
re.finditer(self, string, pos=0, endpos=-1)
返回一个顺序访问每一个匹配结果(Match对象)的迭代器
import re
p = re.compile(r'\d+' )
for m in p.finditer('one1two2three3four4' ):
print(m.group())
将正则表达式编译成pattern对象
re.compile(pattern, flags=0)
import re
pattern = re.compile(r'hello' )
match = pattern.match('hello world!' )
if match:
print match.group()
编译标志
re.ASCII 或 re.A
设置采用ASCII编码re.UNICODE 或 re.U
设置采用UNICODE编码re.IGNORECASE 或 re.I
忽略大小写 re.DOTALL 或 re.S
使用(.)元字符匹配换行符re.MULTILINE 或 re.M
多行模式re.VERBOSE 或 re.X
详细模式 可以在正则表达式中添加注释, 可以有空格和换行 便于阅读
修饰符
修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解