正则表达
import re m = re.match('.+t5','dfgt5ab') print (m)#dfgt5ab匹配成功 m = re.match('t5','t5abcd') print (m)#t5abcd匹配成功,从开头就要匹配上 m = re.search('[0-9]','ab45cf') print(m.group(0))#4匹配成功.不一定从开头就匹配上 strr = re.sub('[0-9]', 'f', 'df34gg') print (strr)#dfffgg m = re.findall('[0-9]','54dgg5t') print (m) m = re.split('[0-9]','dgg55t') print (m)
运行结果:
<_sre.SRE_Match object; span=(0, 5), match='dfgt5'>
<_sre.SRE_Match object; span=(0, 2), match='t5'>
4
dfffgg
['5', '4', '5']
['dgg', '', 't']
注意match,search返回的是,匹配成功返回一个正则对象,不成功返回none. 我们可以调用group方法查看匹配到的字符串
m=re.match(r'\d+', '102300hhhj')
print (m.group(0))#102300
下面说下group
下面一个正则表达式:
output_(\d{4})
该正则表达式用括号()包围了一个小的正则表达式,\d{4}。 这个小的正则表达式被用于从结果中筛选想要的信息(在这里是四位数字)。这样被括号圈起来的正则表达式的一部分,称为群(group)。
我们可以m.group(number)的方法来查询群。group(0)是整个正则表达的搜索结果,group(1)是第一个群……
import re m = re.search("output_(\d{4})", "output_1986.txt") print (m.group(0))#output_1986 print(m.group(1))#1986
我们还可以将群命名,以便更好地使用m.group查询:
import re m = re.search("output_(?P<year>\d{4})", "output_1986.txt") #(?P<name>...) 为group命名 print(m.group("year"))
关于反斜杠:
由于正则表达式使用反斜杠来转义特殊字符,而python自身处理字符串时,反斜杠也是用于转义字符,这样就产生了一个双重转换的问题。
1.比如说普通字符串里的\n是换行符,那么正则表达式如何去表达字符串里的这个\?答案是是用两个反斜杠,第一个反斜杠起到去掉后面那个反斜杠转义的作用,单纯的表示字符串里的\
m=re.match("\\n","\n")
print (m)#匹配成功
2.字符串里一个\在正则表达式里需要用两个\表示,那么字符串里两个\在正则表达式里则需要四个\表示
m=re.match("\\\\n","\\n")
print (m)#匹配成功
m=re.match("\\\\n",r"\n")
print (m)#与上一个同理,匹配成功
3.在正则表达式前置r表示兼容模式,可以理解为:兼容了正则表达式的规则的字符串,先说明一点,在字符串中,\只有在有限的几个字符前面才表示转义,比如后面的这个字符是n,那这个\是转义,或者后面的这个字符就是\,那前面的第一个\也是转义。但如果不是那几个字符,比如9,d,那么\就不是转义了,就是单纯的反斜杠
print ("x\n")#\是转义
print ("\\s")#第一个\是转义,打印\s
print ("\9")#不是转义,打印\9
print ("\d")#不是转义,打印\d
所以,在python中字符串'\\d'和'\d'表示相同的字符 '\\d' is '\d'
但是\d在正则表达式里确是整数的意思,在正则表达式前面加r,可以理解为,先把这个正则表达式看成字符串,并且这个字符串的规则里加入正则表达式的规则,而后形成的字符串,再去匹配后面的字符串
m=re.match(r"\d","5")
print (m)#匹配成功,字符串\d表示数字
m=re.match(r"\\d","\\d")
print (m)#匹配成功,把正则表达式视为加入了正则表达式转义规则的字符串,则\\d为字符串\\d
m=re.match(r"\n","\n")
print (m)#匹配长虹
m=re.match(r"\\n","\\n")
print (m)#匹配成功
ret = re.findall(r'[1\-9]',r'\qq')
print (ret)#[]
ret = re.findall('[1\-9]',r'\qq')
print (ret)#正则表达式不加r前缀,此处还是返回空列表,想象为什么
除了\d,正则表达式里还有\-,\d表示数字,\-则表示-
m=re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
print (m)#匹配成功