2011-11-07 19 views
8

Tôi đang cố gắng để có được re.sub để thay thế một mẫu quy định với một giá trị ví dụre.sub không làm việc cho tôi

for lines in f: 
    pattern='\${2}'+key[0]+'\${2}' 
    re.search(pattern,lines) 

này trả lại dòng nơi các mô hình đã được tìm thấy. Ví dụ này là một trong những lợi nhuận kiểm tra nếu có

đây là một thử nghiệm $$ $$

Vấn đề tôi đang gặp là khi tôi làm như sau

re.sub(pattern,key[1],lines) 

có gì xảy ra. Tôi đang thiếu gì? Để biết thêm thông tin key[0]=testkey[1]=replace vì vậy những gì tôi đang cố gắng làm là bất cứ khi nào "$$ test $$" gặp phải, nó sẽ thay thế bằng "thay thế". Tôi không gặp vấn đề gì khi tìm kiếm "$$ test $$" nhưng vì lý do nào đó, re.sub sẽ không thay thế.

+3

Khi bạn cần lưu trữ dấu gạch chéo ngược trong chuỗi, tốt hơn nên sử dụng biểu mẫu dấu gạch chéo ngược kép. Trong trường hợp của bạn, nó hoạt động bằng Python bởi vì ký hiệu đô la không có ý nghĩa đặc biệt khi bắt đầu bằng dấu gạch chéo ngược và vì Python trong trường hợp đó duy trì cả hai ký tự, nhưng trong các ngôn ngữ khác viết '' \ $ ''sẽ có nghĩa là'' $ ''. Khi ai đó đang đọc một chuỗi và tìm thấy dấu gạch chéo ngược mong đợi một điều gì đó đặc biệt hoặc một dấu gạch chéo ngược khác. Nếu bạn cần nhiều dấu gạch chéo ngược trong một chuỗi thì bạn nên sử dụng chuỗi thô ... – 6502

+0

Đối với những người truy cập vào đây với các vấn đề 're.sub' chung, [đảm bảo] (https://stackoverflow.com/questions/8813265/ why-doesnt-ignorecase-flag-re-i-work-in-sub-sub) bạn đang truyền 're.IGNORECASE' như một đối số' flags = ', không phải là đối số' count'. – Noumenon

Trả lời

11

Bạn gán kết quả của re.sub trở lại biến, phải không? ví dụ.

lines = re.sub(pattern, key[1], lines) 

Đó là một chuỗi, vì vậy không thể thay đổi (chuỗi không thay đổi bằng Python), do đó, chuỗi mới được tạo và trả lại cho bạn. Nếu bạn không gán nó trở lại tên, bạn sẽ mất nó.

+0

ahhh tôi nghĩ rằng nó thay thế nó. làm thế nào tôi sẽ đi về việc thay thế dòng này trong một tập tin? btw cảm ơn vì điều này.Tôi không thể tin rằng điều này đã không xảy ra với tôi – aport002

+0

Trong một tập tin, bạn sẽ đọc từng dòng từ một tập tin đầu vào và ghi nó vào một tập tin đầu ra; ở cuối, nếu bạn muốn, xóa tập tin gốc và đổi tên tập tin đầu ra. Hoặc nếu tập tin sẽ vừa với bộ nhớ, bạn có thể đọc nó hoàn toàn vào bộ nhớ, thực hiện các thay đổi của bạn và viết nó trở lại cùng một tệp. Có rất nhiều ví dụ về SO và các nơi khác trên Web để thực hiện điều này bằng Python. – kindall

+0

Cảm ơn rất nhiều. Bạn đã giúp đỡ rất nhiều. – aport002

2

Nếu bạn có một văn bản, bạn có thể chạy re.sub() trực tiếp trên toàn bộ văn bản như sau:

import re 

ss = '''that's a line 
another line 
a line to $$test$$ 
123456 
here $$test$$ again 
closing line''' 

print(ss,'\n') 

key = {0:'test', 1:'replace'} 

regx = re.compile('\$\${[0]}\$\$'.format(key)) 

print(regx.sub(key[1],ss)) 

.

Nếu bạn đọc một tập tin, bạn nên có sự quan tâm để đọc toàn bộ tập tin và đặt nó trong một đối tượng ss trước khi runing re.sub() vào nó, thay vì đọc và thay thế dòng sau dòng

.

Và nếu bạn có một danh sách các dòng, bạn phải xử lý như sau:

import re 

key = {0:'test', 1:'replace'} 

regx = re.compile('\$\${[0]}\$\$'.format(key)) 

lines = ["that's a line", 
     'another line', 
     'a line to $$test$$', 
     '123456', 
     'here $$test$$ again', 
     'closing line'] 

for i,line in enumerate(lines): 
    lines[i] = regx.sub(key[1],line) 

Nếu một dòng chứa '$$ $$ thử nghiệm' sẽ không được sửa đổi:

import re 

key = {0:'test', 1:'replace'} 

regx = re.compile('\$\${[0]}\$\$'.format(key)) 

lines = ["that's a line", 
     'another line', 
     'a line to $$test$$', 
     '123456', 
     'here $$test$$ again', 
     'closing line'] 

for line in lines: 
    line = regx.sub(key[1],line) 


print (lines) 

kết quả

["that's a line", 'another line', 'a line to $$test$$', '123456', 'here $$test$$ again', 'closing line'] 
Các vấn đề liên quan