Python - 替换字符串,无论大写字母和小写字母本身加上特殊字符

时间:2017-04-22 12:48:19

标签: python string replace

给出一个字符串:

s = "abc, Abc, aBc, abc-def, abca"

和一句话:

w = "abc"

我想以下列方式修改s:

!+abc+!, !+Abc+!, !+aBc+!, abc-def, abca

换句话说,我希望替换abc中出现的任何小写或大写字母,其前面是!+,后跟+!

我已经知道我的问题非常类似于这个问题: Match string in python regardless of upper and lower case differences

尽管如此,它仍然略有不同。

目前我的解决方案非常脏并且无法正常工作:

s = "abc, Abc, aBc, abc-def, abca"
w = "abc"
if w in s:
    s = s.replace(w, "!+"+w+"+!")
if w.title() in s:
    s = s.replace(w.title(), "!+"+w.title()+"+!")

3 个答案:

答案 0 :(得分:4)

即使没有正则表达式,它也非常直接。

>>> ', '.join('!+{}+!'.format(x) if x.lower()==w else x for x in s.split(', '))
'!+abc+!, !+Abc+!, !+aBc+!, abc-def, abca'

编辑:使用列表理解而不是生成器理解更快,所以

', '.join(['!+{}+!'.format(x) if x.lower()==w else x for x in s.split(', ')])

应该是首选。请阅读this问题以及Raymond Hettinger特别提出的答案。

答案 1 :(得分:2)

使用正则表达式:

var useFunctions = require('./someFunctions');
var num = 5;
console.log(useFunctions.Double(num));
console.log(useFunctions.Triple(num));

模式In [16]: re.sub(r'(?: |^)(abc),',r'!+\1+!,', s, flags=re.I) Out[16]: '!+abc+!,!+Abc+!,!+aBc+!, abc-def, abca' 将匹配空格或字符串开头((?: |^)(abc),)后面的每个abc,后跟一个逗号,并将其替换为包围的第一个捕获的组与您的预期字符。请注意,第一组中的^会使其成为未捕获的组,因此:?将引用\1。我们还使用abc标志,这是一个忽略大小写标志。

如果您还想保留空格,只需使用第一组的捕获组:

re.I

另请注意,如果要将多个正则表达式作为替换模式传递,可以使用In [19]: re.sub(r'( |^)(abc),',r'\1!+\2+!,', s, flags=re.I) Out[19]: '!+abc+!, !+Abc+!, !+aBc+!, abc-def, abca' 编译第一个正则表达式,并在循环中传递其他模式:

re.compile()

作为处理my_regex = re.compile(r'( |^)(abc),') my_new_result = [my_regex.sub(pattern, s, flags=re.I) for pattern in list_of_patterns] 的更灵活的方式,您还可以将函数作为替换器传递,并对捕获的字符串执行更多操作。例如,如果要小写匹配的字符串:

re.sub

答案 2 :(得分:0)

您可以使用 sub 如下所示进行替换。 使用 re.escape() :如果要转义的字符串中有任何特殊字符。否则,它也会起作用

re.sub(re.escape(value_want_to_replace),'value_to_be_replaced_with', flags=re.IGNORECASE)

示例:用 arpan 替换所有 Null/NULL/nulL

   expected_result = "We are doing ignore case replacement for Null, NULL, nulL and space, SPACE, sPace"
   __expected_result = re.sub(re.escape("null"), 'arpan', expected_result, flags=re.IGNORECASE)
    print(__expected_result)

结果:

我们正在对 arpan、arpan、arpan 和 space、SPACE、sPace 进行忽略大小写替换