match(pattern, string, flag)
import re
string = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) (.*)', string)
for i in range(4):
print(matchObj.group(i))
输出:
Cats are smarter than dogs #group(0)
Cats
smarter
than dogs
一个小括号代表是一个group,索引从1开始。索引0表示match的结果。
-
正则表达式patter之后的?表示非贪婪匹配。比较group(2)和group(3)可以看出来区别。2遇到可以停的地方就停了,3一直匹配到了最后。
-
import re string = "Cats are smarter than dogs" # matchObj = re.search( r' (.+?)', string) matchObj = re.match( r'(.*) are (.*?) (.*?)', string) for i in range(4): print(matchObj.group(i))- 这样的group(3)为空,因为*是匹配0个到多个字符,然后有了?之后,会让*匹配尽可能少的字符。与group(2)不同的原因是group(2)两边必须是空格,group(3)只要前面是空格就可以了。
-
search(pattern, string, flags=0)
search 和match相似,只是match要从从字符串头开始匹配,search可以任意位置。
import re
line = "Cats are smarter than dogs"
pattern = " are (.*)"
print(re.match(pattern,line))
print(re.search(pattern,line))
输出
None #match的结果
<re.Match object; span=(4, 26), match=' are smarter than dogs'>
Match对象
search()和match() 如果成功匹配返回一个re.MatchObject对象,否则返回None。
import re
line = "Cats are smarter than dogs"
pattern = " are (.*)"
matchObj = re.search(pattern,line)
print(matchObj)
print(matchObj.re)
print(matchObj.string)
print(matchObj.span())
print(matchObj.start())
print(matchObj.end())
输出
<re.Match object; span=(4, 26), match=' are smarter than dogs'> #Match对象
re.compile(' are (.*)') #Match对象的正则表达式对象
Cats are smarter than dogs #Match对象进行匹配的字符串
(4, 26) #成功匹配的index
4 #成功匹配的第一个字符的下标
26 #成功匹配的最后一个字符的下标
sub(pattern, repl, string,count=0, flags=0)
用repl替换掉string中匹配的位置。
repl可以是一个返回字符串的函数
count表示模式匹配后的最大替换次数,默认0表示全部替换。
import re
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print("电话号码是:" + num)
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print("电话号码是:" + num)
输出:
电话号码是:2004-959-559
电话号码是:2004959559
- 其中第一个正则表示从#一直匹配到结束。
-
\D表示所有非数字的字符 - sub函数的返回值是替换之后的字符串
import re
# 将匹配的数字乘以 2
def double(matched):
value = int(matched.group('value'))
return str(value * 2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
输出:
A46G8HFD1134
- (?P<value>)是给这个pattern分组取一个名字
import re
# 将匹配的数字乘以 2
def double(matched):
value = int(matched.group(1))
return str(value * 2)
s = 'A23G4HFD567'
print(re.sub('(\d+)', double, s)) #输出 A46G8HFD1134
所以Match对象的group方法除了可以传入index以外,还可以传入分组名称。
re.compile(pattern[, flags])
为了提高pattern的复用性,可以将pattern字符串编译成一个re.RegexObject 对象。
Pattern对象有和re模块中相同的方法,但更灵活
Pattern.match(string [, startIndex, endIndex]):可以从指定位置开始。
-
flag:
- re.I 忽略大小写
pattern.findall(string [, pos [, endpos]])
成功匹配就返回一个满足正则的字符串list,否则空list。
re.finditer(pattern, string, flags=0)
和pattern.findall()类似,但是返回的迭代器。
import re
it = re.finditer(r"\d+", "12a32bc43jf3")
for match in it:
print(match.group())
输出:
12
32
43
3
迭代器的使用都可以通过for-in循环。
re.split(pattern, string [, maxsplit=0, flags=0])
pattern匹配到的字符串等价于分隔符
re特殊字符
| 模式 | 描述 |
|---|---|
| . | 匹配任何字符,除了换行符 |
| * | 匹配0个或多个 |
| + | 匹配1个或多个 |
| ? | 匹配0个或1个前面的正则模式,非贪婪方式 |
| \w | 匹配字母、数字、和下划线 |
| \W | 匹配所有非数字、非字母、非下划线的字符,和\w相反 |
| \s | 匹配任意空白字符,等价[ \t\n\r\f],(空白符,制表符,换行符,...) |
| \S | 匹配任意非空字符,和\s相反 |
| \d | 匹配任意数字 |
| \D | 匹配任意非数字 |
| \b | 匹配单词的边界,也就是单词和空格之间的位置。例如‘er\b’可以匹配到never中的‘er’,不能匹配到'verb'中的'er' |
| \B | 匹配单词非边界,也就是单词和空格之间的位置。和\b相反 |