Cách dễ nhất để thực hiện thay thế chuỗi phân biệt chữ hoa chữ thường bằng Python là gì?Thay thế không phân biệt chữ hoa chữ thường
Trả lời
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'
import re
pattern = re.compile("hello", re.IGNORECASE)
pattern.sub("bye", "hello HeLLo HELLO")
# 'bye bye bye'
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):]
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
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. –
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. –
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
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
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. –
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))
Đố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
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'
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'
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.
- 1. Không phân biệt chữ hoa chữ thường không hoạt động
- 2. GetElementsByTagName không phân biệt chữ hoa chữ thường?
- 3. XML có phân biệt chữ hoa chữ thường không?
- 4. Đường dẫn XML - không phân biệt chữ hoa chữ thường
- 5. Tìm kiếm không phân biệt chữ hoa chữ thường SOLR
- 6. Tên tệp không phân biệt chữ hoa chữ thường?
- 7. Trường hợp Rspec không phân biệt chữ hoa chữ thường
- 8. Hàm in_array không phân biệt chữ hoa chữ thường
- 9. không phân biệt chữ hoa chữ thường trong NSArray chứaObject:
- 10. Java có phân biệt chữ hoa chữ thường không?
- 11. GetMethod không phân biệt chữ hoa chữ thường?
- 12. URL không phân biệt chữ hoa chữ thường với mod_rewrite
- 13. không phân biệt chữ hoa chữ thường số
- 14. Tên bảng có phân biệt chữ hoa chữ thường không?
- 15. Không phân biệt chữ hoa chữ thường với Dynamic Linq
- 16. Biến Bash: phân biệt chữ hoa chữ thường hay không?
- 17. Có cách nào thay thế cho chuỗi.Địa chỉ không phân biệt chữ hoa chữ thường không?
- 18. Thay thế chuỗi không phân biệt chữ hoa chữ thường trong JavaScript?
- 19. Không phân biệt chữ hoa chữ thường thay thế tất cả
- 20. Cột chuỗi phân biệt chữ hoa chữ thường trong SQLAlchemy?
- 21. Đối sánh phân biệt chữ hoa chữ thường trong Marpa
- 22. JavaScript: tìm kiếm phân biệt chữ hoa chữ thường
- 23. khớp với phân biệt chữ hoa chữ thường trong xpath?
- 24. DISTINCT MySQL phân biệt chữ hoa chữ thường
- 25. Tìm kiếm danh sách phân biệt chữ hoa chữ thường
- 26. Loại.Không phân biệt chữ hoa chữ thường - WinRT
- 27. Chạy truy vấn cypher phân biệt chữ hoa chữ thường
- 28. OData và phân biệt chữ hoa chữ thường
- 29. GSON deserialize theo cách phân biệt chữ hoa chữ thường
- 30. Tìm kiếm phân biệt chữ hoa chữ thường trong grails
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') –
+1 cho re.escape – daboross
Tại sao ** re.escape ** chỉ cho một chuỗi chữ cái? Cảm ơn. – Elena