认识字符串'
:AA嗯,这太棒了。 AA它是。 BB哇。 AA正如我所说。
以下是代码:
s = AA Well, This is amazing. AA It is. BB Wow. AA As I said.
separate_words_tuple = s.split()
i = 0
for word in separate_words_tuple:
check_word = word
if re.search("[A-Z]+", str(check_word)):
match = re.search("[A-Z]+", str(check_word))
if (len(match.group(0)) != 1):
actor_name = match.group(0) + "_" + str(i)
print(re.sub(r"[A-Z]+", actor_name, s))
i += 1
这是什么' s'看起来像那段代码:
AA_3 AA_3ell,AA_3这太棒了。 AA_3 AA_3t是。 AA_3 AA_3ow。 AA_3 AA_3s AA_3说。
这就是我想要的' s'看起来像:
AA_0嗯,这太棒了。 AA_1确实如此。 BB_2哇。 AA_3正如我所说。
答案 0 :(得分:2)
使用功能的静态属性计算所有匹配的项目。 incCaps()
是替换回调。
s = 'AA Well, This is amazing. AA It is. BB Wow. AA As I said.'
def incCaps(m):
replaced = m.group(0) + '_' + str(incCaps.counter)
incCaps.counter += 1
return replaced
incCaps.counter = 0
s = re.sub(r'\b[A-Z]{2,}\b', incCaps, s)
print(s)
输出:
AA_0 Well, This is amazing. AA_1 It is. BB_2 Wow. AA_3 As I said.
答案 1 :(得分:0)
@RomanPerekhrest是对的 - re.sub
为我们提供了一个将函数作为参数传递的绝佳机会。但是具有状态的全局功能是代码气味 - 此功能不可测试甚至可重复使用。
我建议采用两种类似的重构方法:
让match_counter
全局重用:
def match_counter():
counter = -1
def inc_caps(m):
counter += 1
return '{}_{}'.format(m.group(0), counter)
return inc_caps
s = re.sub(r'\b[A-Z]{2,}\b', match_counter(), s)
或使整个事物成为一个单一的功能单元:
def replaced_by_counts(regex, string):
counter = -1
def inc_caps(m):
counter += 1
return '{}_{}'.format(m.group(0), counter)
return regex.sub(inc_caps, string)