2009-05-28 63 views

Trả lời

148

Loại string không hỗ trợ điều này. Có lẽ bạn đang sử dụng tốt nhất việc sử dụng the regular expression sub method với tùy chọn re.IGNORECASE.

>>> import re 
>>> insensitive_hippo = re.compile(re.escape('hippo'), re.IGNORECASE) 
>>> insensitive_hippo.sub('giraffe', 'I want a hIPpo for my birthday') 
'I want a giraffe for my birthday' 
+7

Nếu bạn chỉ thực hiện một thay thế duy nhất hoặc muốn lưu các dòng mã, sẽ hiệu quả hơn khi sử dụng một thay thế đơn lẻ với re.sub và cờ (? I): re.sub ('(? I) '+ lại.trốn thoát ('hà mã'), 'hươu cao cổ', 'Tôi muốn có một hIPpo cho sinh nhật của tôi') –

+8

+1 cho re.escape – daboross

+2

Tại sao ** re.escape ** chỉ cho một chuỗi chữ cái? Cảm ơn. – Elena

61
import re 
pattern = re.compile("hello", re.IGNORECASE) 
pattern.sub("bye", "hello HeLLo HELLO") 
# 'bye bye bye' 
2

này không đòi hỏi RegularExp

def ireplace(old, new, text): 
    """ 
    Replace case insensitive 
    Raises ValueError if string not found 
    """ 
    index_l = text.lower().index(old.lower()) 
    return text[:index_l] + new + text[index_l + len(old):] 
+2

Tốt nhất, tuy nhiên điều này không thay đổi tất cả các lần xuất hiện cũ với mới, nhưng chỉ xuất hiện lần đầu tiên. – rsmoorthy

+3

Nó ít có thể đọc được hơn phiên bản regex. Không cần phải phát minh lại bánh xe ở đây. –

+0

Thật thú vị khi thực hiện so sánh hiệu suất giữa phiên bản này và các phiên bản upvoted, nó có thể nhanh hơn, điều này quan trọng đối với một số ứng dụng. Hoặc nó có thể chậm hơn vì nó hoạt động nhiều hơn trong việc diễn giải Python. –

5

Tiếp tục về câu trả lời của bFloch, chức năng này sẽ thay đổi không phải một, nhưng tất cả các lần xuất hiện của cũ với mới - trong một vụ án thời trang nhạy cảm.

def ireplace(old, new, text): 
    idx = 0 
    while idx < len(text): 
     index_l = text.lower().find(old.lower(), idx) 
     if index_l == -1: 
      return text 
     text = text[:index_l] + new + text[index_l + len(old):] 
     idx = index_l + len(new) 
    return text 
+0

Rất tốt. Tốt hơn nhiều so với regex; nó xử lý tất cả các loại ký tự, trong khi regex là rất cầu kỳ về bất cứ điều gì không phải chữ và số. Câu trả lời ưu tiên IMHO. – fyngyrz

+0

Tất cả những gì bạn phải làm là thoát khỏi regex: câu trả lời được chấp nhận ngắn hơn và dễ đọc hơn nhiều so với điều này. –

-1

không bao giờ gửi một câu trả lời trước và chủ đề này thực sự là cũ nhưng tôi đã đưa ra sollution khác và đã tìm tôi có thể nhận được respons của bạn, Im không dày dạn trong việc lập trình Python vì vậy nếu có những nhược điểm appearant với nó, xin vui lòng chỉ chúng ra kể từ khi học tập tốt của mình :)

i='I want a hIPpo for my birthday' 
key='hippo' 
swp='giraffe' 

o=(i.lower().split(key)) 
c=0 
p=0 
for w in o: 
    o[c]=i[p:p+len(w)] 
    p=p+len(key+w) 
    c+=1 
print(swp.join(o)) 
+2

Đối với việc học: thông thường khi bạn thực hiện tìm kiếm và thay thế trên một chuỗi, tốt nhất là không cần phải biến nó thành một mảng trước tiên. Đó là lý do tại sao câu trả lời đầu tiên có lẽ là tốt nhất. Trong khi nó sử dụng một module bên ngoài, nó xử lý chuỗi như một chuỗi toàn bộ. Nó cũng là một chút rõ ràng hơn những gì đang xảy ra trong quá trình này. – isaaclw

25

Rất đơn giản, trong một dòng duy nhất:

import re 
re.sub("(?i)hello","bye", "hello HeLLo HELLO") #'bye bye bye' 
re.sub("(?i)he\.llo","bye", "he.llo He.LLo HE.LLO") #'bye bye bye' 

Hoặc, sử dụng "cờ" bắt buộc đối số:

import re 
re.sub("hello", "bye", "hello HeLLo HELLO", flags=re.I) #'bye bye bye' 
re.sub("he\.llo", "bye", "he.llo He.LLo HE.LLO", flags=re.I) #'bye bye bye' 
1

Giống như Blair Conrad nói string.replace không hỗ trợ điều này.

Sử dụng regex re.sub, nhưng hãy nhớ thoát chuỗi thay thế trước. Lưu ý rằng không có tùy chọn cờ trong 2.6 cho re.sub, vì vậy bạn sẽ phải sử dụng công cụ sửa đổi được nhúng '(?i)' (hoặc đối tượng RE, xem câu trả lời của Blair Conrad). Ngoài ra, một lỗ hổng khác là tiểu sẽ xử lý dấu gạch chéo ngược trong văn bản thay thế, nếu một chuỗi được đưa ra. Để tránh điều này, thay vào đó bạn có thể vượt qua trong một lambda.

Dưới đây là một chức năng:

import re 
def ireplace(old, repl, text): 
    return re.sub('(?i)'+re.escape(old), lambda m: repl, text) 

>>> ireplace('hippo?', 'giraffe!?', 'You want a hiPPO?') 
'You want a giraffe!?' 
>>> ireplace(r'[binfolder]', r'C:\Temp\bin', r'[BinFolder]\test.exe') 
'C:\\Temp\\bin\\test.exe' 
0

Tôi đã có \ t được chuyển đổi sang escape sequences (di chuyển một chút xuống), vì vậy tôi lưu ý rằng re.sub cải backslashed thoát nhân vật để thoát khỏi chuỗi.

Để ngăn chặn điều đó, tôi đã viết như sau:

Thay thế phân biệt chữ hoa chữ thường.

import re 
    def ireplace(findtxt, replacetxt, data): 
     return replacetxt.join( re.compile(findtxt, flags=re.I).split(data) ) 

Ngoài ra, nếu bạn muốn nó để thay thế với các ký tự thoát, giống như câu trả lời khác ở đây mà đang nhận được những nhân vật bashslash ý nghĩa đặc biệt chuyển đổi để thoát khỏi chuỗi, chỉ cần giải mã tìm bạn và, hoặc thay thế chuỗi. Trong Python 3, có thể phải làm một cái gì đó giống như .decode ("unicode_escape") # python3

findtxt = findtxt.decode('string_escape') # python2 
replacetxt = replacetxt.decode('string_escape') # python2 
data = ireplace(findtxt, replacetxt, data) 

Tested bằng Python 2.7.8

Hy vọng rằng sẽ giúp.

Các vấn đề liên quan