创建正则表达式
匹配(大写表示去反)
\d可以匹配一个数字,\w可以匹配一个字母或数字\s可以匹配一个空白.可以匹配任意字符
长度
- 任意长度
- 大于一个
?表示0个或1个字符- 用
{n}表示n个字符,用{n,m}表示n-m个字符
开头结尾
^表示行的开头,^\d表示必须以数字开头。$表示行的结束,\d$表示必须以数字结束
方括号 []
[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
圆括号 ()组
- (…) 匹配括号内的任何正则表达式,并指示组的开始和结束; 在匹配完成后可以检索组的内容,并且可以在后面的字符串中使用\number特殊序列进行匹配,之后有详细描述。 要匹配’(‘或’)’,请使用
\(或\),或将它们放在字符类中:[(],[]]。 举个例子我有个字符串 ‘asdfa020-12345678bsaefga’ 可以看到我们的电话号码被一群字母围住了,怎么把电话号码拿出来,顺便把区号和真正的号码都分开呢? 可以用这样的规则(\d{4})-(\d)* 这样符合结果字符串就是 ‘020-12345678’ 但是,返回的结果对象并不仅仅是一个字符串,他还有.group,其中 group(1) = ‘020’ group(2)=’12345678’ - \number 匹配相同编号的组的内容。
- (?P
…) - (?aiLmsux)
A|B可以匹配A或B
? 可以表示非贪婪匹配
re.match(r'^(\d+?)(0*)$', '102300').groups()
re 模块
使用 re 模块 import re
由于反斜杠在 Python 中也有用处,而在正则中表示转义;所以一般使用 ‘s’ + 正则;这样就可以使用单引号了;
例 **s = r'ABC\-001**
正则表达式对象
我们写好一条规则,如r’.ello’,目前在python里面只是一个字符串,我们要让这个规则字符串变成正则表达式,需要将这个字符串编译一下,成为表达式对象,这个对象又称pattern,即样式。
re.compile(pattern, flags=0)
示例
# regex = r'你的规则'pattern = re.compile(regex) #这里 regex只是规则字符串,pattern才是正则表达式对象result = pattern.match(string)# 等价于result = re.match(regex, string)
方法
- pattern.search(string[, pos[, endpos]]) :
- 扫描字符串查找第一个能匹配上pattern的部分,并返回相应的匹配对象。 如果字符串中没有位置与模式匹配,则返回None;
- 可选的第二个参数pos在搜索要开始的字符串中给出一个索引,它默认为0,
- 可选参数endpos表示搜索字符串的截止位置,也就是说,你想避开字符串结尾的部分。
- Pattern.match(string[, pos[, endpos]])
- 如果字符串开头的零个或多个字符与此正则表达式匹配,则返回相应的匹配对象。 如果字符串与模式不匹配,则返回None;
- 这个函数和search差不多,但是,规定一定要从起始位置就得匹配上,否则就不算匹配成功。
- 如果正则表达式中定义了组,就可以在
Match对象上用group()方法提取出子串来。注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。
- pattern.fullmatch(string[, pos[, endpos]])
- 如果整个字符串匹配此正则表达式,则返回相应的匹配对象。 如果字符串与模式不匹配,则返回None; 请注意,这与零长度匹配不同
pattern.split(string, maxsplit=0)
- 这个函数根据表达式规则分拆字符串,返回一个list
- 如果在表达式中使用捕获括号,则表达式中所有组的文本也会作为结果列表的一部分返回
如果maxsplit不为零,则最多发生maxsplit分割,并且字符串的其余部分作为列表的最后一个元素返回。
>>> pattern = re.compile(r'\W+')>>> pattern.split( 'Words,words,words.')['Words', 'words', 'words', '']>>> pattern = re.compile(r'(\W+)')>>> pattern.split( 'Words, words, words.')['Words', ', ', 'words', ', ', 'words', '.', '']
如果分隔符中有捕获组,并且它在字符串的起始处匹配,则结果将以空字符串开头。 字符串的结尾也是一样
>>> pattern = re.compile(r'(\W+)')>>> pattern.split( '...words, words...')['', '...', 'words', ', ', 'words', '...', '']
pattern.finditer(string[, pos[, endpos]])
- 返回一个迭代器,产生字符串中RE模式的所有非重叠匹配的匹配对象。
pattern.sub(repl, string, count=0)
- python自带replace函数的加强版。
- 先通过正则表达式规则找到string中符合规则的部分,然后替换成repl;如果未找到能匹配规则的部分,则字符串将保持不变。
repl可以是一个字符串或一个函数; 如果它是一个字符串,则处理其中的任何反斜杠转义。
>>> pattern = re.compile(r'\d*(\d)')>>> pattern.sub(r'\1','12abc34de56fg89') # 这里的r'\1'对应的就是上面 r'\d*(\d)'中的(\d)'2abc4de6fg9'
如果repl是一个函数,它会实现更加复杂的替换,比如我们需要把分割字母的数字翻倍。也就是,我们我们每个匹配到的数字,我们都要通过函数处理一下,以返回值作为repl 例如
>>> def func(n):... return str(int(n.group())*2)...>>> pattern = re.compile(r'\d+')>>> pattern = re.sub(func,'12abc34de56fg89')'24abc68de112fg178'
pattern.subn(repl, string, count=0)
属性
- pattern.flags
- 正则表达式匹配标志。在re.compile()函数中设定,
- 值 :
- re.A 仅ASCII匹配而不是完全Unicode匹配
- re.I 不区分大小写
- 其他 。。。(百度)
- pattern.groups
- 查看模式中的捕获组数量。也就是你在规则中使用捕获括号的数量;比如 p = re.compile(r’hello(\d)’) 那么这时 p.groups 就是 1
- pattern.groupindex
- 如果你在规则设定的时候使用了(?P
),那么这个变量可以返回该特殊符号使用的情况。 将(?P )定义的任何符号组名称映射到组编号的字典。 如果模式中没有使用符号组,则字典为空。
- 如果你在规则设定的时候使用了(?P
- pattern.pattern
- 模式对象编译的模式字符串。就是那个写下的规则。
