【问题标题】:How to replace a non-static substring case-insensitively如何不区分大小写地替换非静态子字符串
【发布时间】:2010-07-29 23:59:23
【问题描述】:

这个问题类似于this,只是要替换的子字符串只有在运行时才知道。

我想写ireplace的定义,行为如下:

>>> ireplace(r'c:\Python26\lib\site.py', r'C:\python26', r'image\python26')
r'image\python26\lib\site.py'
>>>

【问题讨论】:

  • 确定不希望返回的字符串以 c:\ 开头吗?如果是这样,那不仅仅是替代品。
  • @Jon-Eric:那是我的错误,我修正了这个例子。

标签: python string case-insensitive


【解决方案1】:

在这种情况下,我认为这是最简单的方法

r'c:\Python26\lib\site.py'.lower().replace('python26', r'image\python26')

为了不区分大小写,正则表达式是最简单的方法

>>> def ireplace(s, a, b):
...     return re.sub("(?i)"+re.escape(a),b,s)
...
>>> print ireplace(r'c:\Python26\lib\site.py', 'C:\python26', r'image\python26')
image\python26\lib\site.py

【讨论】:

  • 嗯,隐含的假设是我想保留输入字符串的大小写。您的解决方案不会保留大小写。
  • @Sridhar,我使用正则表达式添加了一个不区分大小写的版本。你不应该逃避b,因为你没有将它用作正则表达式,只是a
  • 将此标记为答案,因为它比我的解决方案更简单。
【解决方案2】:
def ireplace(s, a, b):
    """Replace `a` with `b` in s without caring about case"""
    re_a = re.compile(re.escape(a), re.IGNORECASE)
    return re_a.sub(lambda m: b, s)

注意:lambda m: b hack 是必要的,因为re.escape(b) 似乎会破坏带有连字符的字符串。

【讨论】:

  • 有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。
猜你喜欢
  • 2011-06-30
  • 2013-03-14
  • 1970-01-01
  • 2018-02-25
  • 2010-09-21
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多