findall: 找寻所有匹配,返回所有组合的列表
search: 找寻第一个匹配并返回
sub: 替换符合规律的内容,并返回替换后的内容
.:匹配除了换行符以外的任意字符
1
2
3
4
|
a = 'xy123'
b = re.findall( 'x...' ,a)
print (b)
# ['xy12']
|
*:匹配前一个字符0次或者无限次
1
2
3
4
|
a = 'xyxy123'
b = re.findall( 'x*' ,a)
print (b)
# ['x', '', 'x', '', '', '', '', '']
|
?:匹配前一个字符0次或者1次
1
2
3
4
|
a = 'xy123'
b = re.findall( 'x?' ,a)
print (b)
# ['x', '', '', '', '', '']
|
.*:贪心算法
1
2
3
|
b = re.findall( 'xx.*xx' ,secret_code)
print (b)
# ['xxIxxfasdjifja134xxlovexx23345sdfxxyouxx']
|
.*?:非贪心算法
1
2
3
|
c = re.findall( 'xx.*?xx' ,secret_code)
print (c)
# ['xxIxx', 'xxlovexx', 'xxyouxx']
|
():括号内结果返回
1
2
3
4
5
6
7
8
|
d = re.findall( 'xx(.*?)xx' ,secret_code)
print (d)
for each in d:
print (each)
# ['I', 'love', 'you']
# I
# love
# you
|
re.S使得.的作用域包括换行符”\n”
1
2
3
4
5
6
|
s = '''sdfxxhello
xxfsdfxxworldxxasdf'''
d = re.findall( 'xx(.*?)xx' ,s,re.S)
print (d)
# ['hello\n', 'world']
|
对比findall与search的区别
1
2
3
4
5
6
7
|
s2 = 'asdfxxIxx123xxlovexxdfd'
f = re.search( 'xx(.*?)xx123xx(.*?)xx' ,s2).group( 2 )
print (f)
f2 = re.findall( 'xx(.*?)xx123xx(.*?)xx' ,s2)
print (f2[ 0 ][ 1 ])
# love
# love
|
虽然两者结果相同,但是search是搭配group来得到第二个匹配,而findall的结果是[(‘I', ‘love')],包含元组的列表,所以需要f2[0][1]来引入。
sub的使用
1
2
3
4
|
s = '123rrrrr123'
output = re.sub( '123(.*?)123' , '123%d123' % 789 ,s)
print (output)
# 123789123
|
例如我们需要将文档中的所有的png图片改变路径,即需要找到所有的 .png 结尾,再将其都加上路径,
1
2
3
4
5
6
7
8
9
10
|
import re
def multiply(m):
# Convert group 0 to an integer.
v = m.group( 0 )
print (v)
# Multiply integer by 2.
# ... Convert back into string and return it.
print ( 'basic/' + v)
return 'basic/' + v
|
结果如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
>>>autoencoder.png
basic / autoencoder.png
RNN.png
basic / RNN.png
rnn_step_forward.png
basic / rnn_step_forward.png
rnns.png
basic / rnns.png
rnn_cell_backprop.png
basic / rnn_cell_backprop.png
LSTM.png
basic / LSTM.png
LSTM_rnn.png
basic / LSTM_rnn.png
attn_mechanism.png
basic / attn_mechanism.png
attn_model.png
basic / attn_model.png
|
仿照上面案例,我们可以方便的对我们的任务进行定制。
subn相比sub,subn返回元组,第二个元素表示替换发生的次数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import re
def add(m):
# Convert.
v = int (m.group( 0 ))
# Add 2.
return str (v + 1 )
# Call re.subn.
result = re.subn( "\d+" , add, "1 2 3 4 5" )
print ( "Result string:" , result[ 0 ])
print ( "Number of substitutions:" , result[ 1 ])
>>>
Result string: 11 21 31 41 51
Number of substitutions: 5
|
原文链接:http://frankchen.xyz/2018/02/24/re-basic-of-python/