附加到字符串[Python]

时间:2017-01-06 18:46:47

标签: python regex

认识字符串'

  

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正如我所说。

2 个答案:

答案 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为我们提供了一个将函数作为参数传递的绝佳机会。但是具有状态的全局功能是代码气味 - 此功能不可测试甚至可重复使用。

我建议采用两种类似的重构方法:

  1. 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)
    
  2. 或使整个事物成为一个单一的功能单元:

    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)