给出一个字符串:
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()+"+!")
答案 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 进行忽略大小写替换