2011-02-10 35 views
6

Tôi có số lượng văn bản khá lớn bao gồm các thẻ điều khiển như \ n \ t và \ r. Tôi cần phải thay thế chúng bằng một không gian đơn giản -> "". Cách nhanh nhất để làm điều này là gì? Cảm ơnXóa các ký tự điều khiển cụ thể ( n r t) từ một chuỗi

+0

Rõ ràng, như Zen của Python cho thấy, chỉ có cách để làm điều đó; -) – gruszczy

+0

khi chuỗi có nhiều ký tự liền kề như vậy, ví dụ: 'foo \ r \ nbar', bạn có muốn thay thế' \ r \ n' bằng hai dấu cách hoặc chỉ 1 không? –

+0

Tôi muốn thay thế bằng chỉ 1 – Hossein

Trả lời

22

Tôi nghĩ rằng cách nhanh nhất là sử dụng str.translate():

import string 
s = "a\nb\rc\td" 
print s.translate(string.maketrans("\n\t\r", " ")) 

in

a b c d 

EDIT: Khi điều này một lần nữa biến thành một cuộc thảo luận về hiệu suất, ở đây một số con số. Đối với chuỗi dài, translate()cách nhanh hơn so với sử dụng biểu thức thông thường:

s = "a\nb\rc\td " * 1250000 

regex = re.compile(r'[\n\r\t]') 
%timeit t = regex.sub(" ", s) 
# 1 loops, best of 3: 1.19 s per loop 

table = string.maketrans("\n\t\r", " ") 
%timeit s.translate(table) 
# 10 loops, best of 3: 29.3 ms per loop 

Đó là về một yếu tố 40.

+2

Điều quan trọng cần lưu ý là string.translate và string.makestrans không có sẵn trong Python3. giải pháp dựa trên dường như tốt hơn. –

+0

@Ignacio: chuỗi nhập khẩu; hasattr (chuỗi, 'dịch'); hasattr (chuỗi, 'maketrans') Nó sẽ là Sai, nếu bạn làm hasattr (str, 'dịch') và hasattr (str, 'maketrans') nó là đúng. chuỗi mô-đun chỉ là một tập hợp các hằng số chuỗi. Hơn nữa, theo định nghĩa và cách thức thích hợp để sử dụng maketrans sẽ là bytes.maketrans. Cảm ơn! –

8

Bạn cũng có thể thử biểu thức thông thường:

import re 
regex = re.compile(r'[\n\r\t]') 
regex.sub(' ', my_str)
+0

Tôi đã so sánh hiệu suất thực tế và có vẻ như sử dụng cụm từ thông dụng nhanh như sử dụng mô-đun chuỗi. –

+0

'python2.6 timeit.py -s" chuỗi nhập khẩu "-s" s = 'a \ nb \ rc \ td' "-s" s.translate (chuỗi.maketrans ('\ n \ t \ r', ' ')) "' 10000000 vòng, tốt nhất là 3: 0,0235 usec mỗi vòng lặp –

+0

'python2.6 timeit.py -s" nhập lại "-s" regex = re.compile (r' [\ n \ r \ t] ') "-s" regex.sub (' ',' a \ nb \ rc \ td ') "' 10000000 vòng, tốt nhất là 3: 0,0232 usec mỗi vòng lặp –

5
>>> re.sub(r'[\t\n\r]', ' ', '1\n2\r3\t4') 
'1 2 3 4' 
2

sử dụng regex

re.sub(r'\s+', ' ', '1\n2\r3\t4') 

mà không regex

>>> ' '.join('1\n\n2\r3\t4'.split()) 
'1 2 3 4' 
>>> 
3

Nếu bạn muốn bình thường hóa whi tespace (thay thế chạy của một hoặc nhiều ký tự khoảng trắng bởi một không gian duy nhất, và dải hàng đầu và dấu khoảng trắng) này có thể được thực hiện bằng cách sử dụng phương pháp chuỗi:

>>> text = ' foo\tbar\r\nFred Nurke\t Joe Smith\n\n' 
>>> ' '.join(text.split()) 
'foo bar Fred Nurke Joe Smith' 
1

's' là chuỗi mà bạn muốn xóa cụ thể kiểm soát các ký tự. Vì các chuỗi là bất biến trong python, sau khi thao tác thay thế, bạn cần gán nó cho một chuỗi khác.

s = re.sub (r '[\ n \ r \ t] *', '', s)

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