搜索微信公众号:‘AI-ming3526’或者’计算机视觉这件小事’ 获取更多AI干货
csdn:https://blog.csdn.net/abcgkj
github:https://github.com/xiaoming3526/ai-ming3526
import re
(注:re是regular expression的缩写)
正则表达式是处理字符串的强大工具,拥有独特的语法和独立的处理引擎。
我们在大文本中匹配字符串时,有些情况用str自带的函数(比如find, in)可能可以完成,有些情况会稍稍复杂一些(比如说找出所有“像邮箱”的字符串),这个时候我们需要一个某种模式的工具,这个时候正则表达式就派上用场了。说起来正则表达式效率上可能不如str自带的方法,但匹配功能实在强大太多。正则表达式不是Python独有的。
当你要匹配 一个/多个/任意个 数字/字母/非数字/非字母/某几个字符/任意字符,想要 贪婪/非贪婪 匹配,想要捕获匹配出来的 第一个/所有 内容的时候,记得这里有个小手册供你参考。
正则表达式在线验证工具之一是http://regexr.com/
对于想练习正则表达式,或者短期内快速get复杂技能,or想挑战更复杂的正则表达式的同学们。 请戳正则表达式进阶练习
Python通过re模块提供对正则表达式的支持。
使用re的一般步骤是
# encoding: UTF-8
import re
# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello.*\!')
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello, gkj! How are you?')
if match:
# 使用Match获得分组信息
print(match.group())
输出:
hello, kaijie234!
注:由于正则表达式和 \ 会有冲突,因此,当一个字符串使用了正则表达式后,最好在前面加上’r’。
re.compile(strPattern[,flag]):
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。
第二个参数flag是匹配模式,取值可以使用按位或运算符’|‘表示同时生效,比如re.I | re.M。
当然,你也可以在regex字符串中指定模式,比如re.compile(‘pattern’, re.I | re.M)等价于re.compile(’(?im)pattern’)
flag可选值有:
regex_1 = re.compile(r"""\d + # 数字部分
\. # 小数点部分
\d * # 小数的数字部分""", re.X)
regex_2 = re.compile(r"\d+\.\d*")
Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。
import re
m = re.match(r'(\w+) (\w+)(?P.+)' , 'hello kaijie234!')
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'))
输出:
m.string: hello kaijie234!
m.re: re.compile('(\\w+) (\\w+)(?P.+)')
m.pos: 0
m.endpos: 16
m.lastindex: 3
m.lastgroup: sign
m.group(1,2): ('hello', 'kaijie234')
m.groups(): ('hello', 'kaijie234', '!')
m.groupdict(): {'sign': '!'}
m.start(2): 6
m.end(2): 15
m.span(2): (6, 15)
m.expand(r'\2 \1\3'): kaijie234 hello
Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。Pattern不能直接实例化,必须使用re.compile()进行构造。
Pattern提供了几个可读属性用于获取表达式的相关信息:
import re
p = re.compile(r'(\w+) (\w+)(?P.*)' , re.DOTALL)
print("p.pattern:", p.pattern)
print("p.flags:", p.flags)
print("p.groups:", p.groups)
print("p.groupindex:", p.groupindex)
输出:
p.pattern: (\w+) (\w+)(?P.*)
p.flags: 48
p.groups: 3
p.groupindex: {‘sign’: 3}
# encoding: UTF-8
import re
# 将正则表达式编译成Pattern对象
pattern = re.compile(r'k.*4')
# 使用search()查找匹配的子串,不存在能匹配的子串时将返回None
# 这个例子中使用match()无法成功匹配
match = pattern.search('hello kaijie234!')
if match:
# 使用Match获得分组信息
print(match.group())
输出:
kaijie234
split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):
import re
p = re.compile(r'\d+')
print(p.split('one1two2three3four4'))
输出:
['one', 'two', 'three', 'four', '']
import re
p = re.compile(r'\d+')
print(p.findall('one1two2three3four4'))
输出:
['1', '2', '3', '4']
import re
p = re.compile(r'\d+')
for m in p.finditer('one1two2three3four4'):
print(m.group())
输出:
1
2
3
4
import re
p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello kaijie234!'
print(p.sub(r'\2 \1', s))
def func(m):
return m.group(1).title() + ' ' + m.group(2).title()
print(p.sub(func, s))
输出:
say i, kaijie234 hello!
I Say, Hello Kaijie234!