擅长:python、mysql、java
<p>您可以使用<code>re.sub()</code>函数,传递一个callable作为第二个参数:</p>
<pre><code>import re
def extensao(seq):
'"(BA)4B5A", and I want the output to be BABABABABBBBBA'
return re.sub(r'(([AB])|\(([AB]*?)\))(\d+)',
lambda x: (x.group(2) or x.group(3))*int(x.group(4)), seq)
assert extensao("(BA)4B5A") == 'BABABABABBBBBA'
</code></pre>
<p>或者,同等地,也许更容易理解</p>
<pre><code>import re
def extensao(seq):
'"(BA)4B5A", and I want the output to be BABABABABBBBBA'
def replacement(m):
single_char = m.group(2)
multi_char = m.group(3)
count = int(m.group(4))
char = single_char or multi_char
return char * count
pattern = '''
(?x) # Verbose
( # Grouping to detect single char or (multi char)
(.) # Match single char and save it in $2
|
\((.*?)\) # Match (multi char), save inner bit in $3
)
(\d+) # Save count in $4
'''
return re.sub(pattern, replacement, seq)
assert extensao("(BA)4B5A") == 'BABABABABBBBBA'
</code></pre>