2013-05-07 4 views
0

У меня есть словарь в текстовом файле в следующем формате:Регулярные выражения: найти ту же слова в словаре в строке

house house$casa | casa, vivienda, hogar | edificio, casa | vivienda 

Знака $ отделяющего срок перевода.

Я хочу найти словарные слова, которые появляются несколько раз в одной строке, регулярным выражением с текстовым редактором, таким как Sublimetext, Notepad ++, ... Мне не нужна функция php, потому что я должен проверить вручную, если мне нужно удалить эти повторяющиеся слова. В приведенном выше примере регулярное выражение должно найти дом, casa и vivienda. Моя цель была бы получить следующий результат:

house$casa | vivienda, hogar | edificio 

Я попытался, используя следующее выражение, но он не работает должным образом:

(\b\w+\b)\W+\1 
+4

Вы не сможете сделать это с помощью регулярных выражений в одиночку. Привыкайте к идее сделать это с помощью языка программирования. – Tomalak

ответ

0

FWIW, вот грубый пример того, как это сделать в Python:

import re 

def distinct_words(block, seen, delim): 
    """ makes a list of words distinct, given a set of words seen earlier """ 

    unique_words = [] 

    for word in re.split(delim, block): 
     if not word in seen: 
      seen[word] = True 
      unique_words.append(word) 

    return unique_words 

def process_line(line): 
    """ removes all duplicate words from a dictionary line """ 

    # safeguard 
    if '$' not in line: return line 

    # split line at the '$' 
    original, translated = line.split('$') 

    # make original words distinct 
    distinct_original = distinct_words(original, {}, r' +') 

    # make translated words distinct, but keep block structure 

    # split the translated part at '|' into blocks 
    # split each block at ', ' into words 
    seen = {} 
    distinct_translated = [ 
     distinct_list for distinct_list in (
      distinct_words(block, seen, r', +') for block in (
       re.split(r'\s*\|\s*', translated) 
      ) 
     ) 
     if len(distinct_list) > 0 
    ] 

    # put everything back together again 
    part_original = ' '.join(distinct_original) 
    part_translated = [', '.join(block) for block in distinct_translated] 
    part_translated = ' | '.join(part_translated) 
    result = part_original + '$' + part_translated 

    return result 

def process_dictionary(filename): 
    """ processes a dictionary text file, modifies the file in place """ 

    lines = open(filename,'r').readlines()  
    lines_out = [process_line(line) for line in lines] 
    contents_out = '\n'.join(lines_out) 
    open(filename,'w').write(contents_out) 

Видимо, вы могли бы назвать process_dictionary(), как это:

process_dictionary('dict_en_es.txt') 

Но ради примера, предположим, что у вас есть одна строка:

line = "house house$casa | casa, vivienda, hogar | edificio, casa | vivienda" 
line_out = process_line(line) 
print line_out 

который печатает желаемого результата:

 
house$casa | vivienda, hogar | edificio 
Смежные вопросы