2013-07-18 26 views
5

Tôi có một tập lệnh chạy vào văn bản và tìm kiếm của mình và thay thế tất cả các câu tôi viết dựa trên cơ sở dữ liệu.Tìm kiếm và thay thế bằng tùy chọn "toàn bộ từ" chỉ

Kịch bản:

with open('C:/Users/User/Desktop/Portuguesetranslator.txt') as f: 
    for l in f: 
     s = l.split('*') 
     editor.replace(s[0],s[1]) 

Và ví dụ Cơ sở dữ liệu:

Event*Evento* 
result*resultado* 

Và vân vân ...

Bây giờ những gì đang xảy ra là tôi cần những "toàn bộ từ chỉ" trong kịch bản đó, bởi vì tôi đang phát hiện ra mình có vấn đề.

Ví dụ với ResultEvent, bởi vì khi tôi thay thế cho ResultadoEvento, và tôi chạy kịch bản một lần nữa trong văn bản kịch bản thay thế một lần nữa các ResultadoEvento.

Và kết quả sau khi tôi chạy tập lệnh vẫn như thế này ResultadoadoEventoo.

Chỉ cần để các bạn biết .. nó không chỉ đối với tổ chức sự kiện và kết quả, có nhiều sau đó 1000 câu mà tôi đã đặt ra cho việc tìm kiếm và thay thế để làm việc ..

Tôi không cần một simples tìm kiếm và thay thế cho hai từ .. vì tôi sẽ chỉnh sửa cơ sở dữ liệu nhiều lần cho các câu khác nhau ..

+0

là 'editor' một chuỗi? – kindall

Trả lời

5

Sử dụng re.sub thay vì chuỗi bình thường thay thế để chỉ thay thế toàn bộ từ. chạy lại sẽ không thay thế các từ đã thay thế.

>>> import re 
>>> editor = "This is result of the match" 
>>> new_editor = re.sub(r"\bresult\b","resultado",editor) 
>>> new_editor 
'This is resultado of the match' 
>>> newest_editor = re.sub(r"\bresult\b","resultado",new_editor) 
>>> newest_editor 
'This is resultado of the match' 
+0

nơi nào tôi thay thế –

+0

chỉ để chỉ ra .. rằng im hoàn toàn mới để mã hóa và các công cụ, –

+0

chỉ để bạn biết .. cơ sở dữ liệu chứa hơn 1400 từ .. và kết quả và sự kiện chỉ là ví dụ .. –

11

Bạn muốn có cụm từ thông dụng. Bạn có thể sử dụng mã thông báo \b để khớp với ranh giới từ: tức là, \bresult\b sẽ chỉ khớp chính xác với từ "kết quả".

import re 

with open('C:/Users/User/Desktop/Portuguesetranslator.txt') as f: 
    for l in f: 
     s = l.split('*') 
     editor = re.sub(r"\b%s\b" % s[0] , s[1], editor) 
+0

tôi nên thay thế cho kịch bản hiện tại của tôi? và trong cơ sở dữ liệu tôi nên thêm \ b trước mỗi từ? –

+0

ví dụ \ bresult * \ bresultado *? –

+1

Chỉ cần thay thế mã bạn có bằng mã này ... tập lệnh sẽ thêm '\ b' để bạn không cần phải có chúng trong" cơ sở dữ liệu ". – kindall

7

Sử dụng re.sub:

replacements = {'the':'a', 
       'this':'that'} 

def replace(match): 
    return replacements[match.group(0)] 

# notice that the 'this' in 'thistle' is not matched 
print re.sub('|'.join(r'\b%s\b' % re.escape(s) for s in replacements), 
     replace, 'the cat has this thistle.') 

Prints

a cat has that thistle. 

Ghi chú:

  • Tất cả các dây phải được thay thế là joine d thành một mẫu duy nhất để rằng chuỗi cần phải được lặp lại chỉ một lần.

  • Chuỗi nguồn được chuyển đến re.escape để tránh việc diễn giải chúng dưới dạng cụm từ thông dụng.

  • Các từ được bao quanh bởi r'\b' để đảm bảo phù hợp chỉ dành cho toàn bộ các từ.

  • Chức năng thay thế được sử dụng để có thể thay thế bất kỳ trận đấu nào.

1

Nó rất đơn giản. sử dụng re.sub, không sử dụng thay thế.

import re 
replacements = {r'\bthe\b':'a', 
       r'\bthis\b':'that'} 

def replace_all(text, dic): 
    for i, j in dic.iteritems(): 
     text = re.sub(i,j,text) 
    return text 

replace_all("the cat has this thistle.", replacements) 

Nó sẽ in

a cat has that thistle. 
Các vấn đề liên quan