2013-09-09 5 views
0

У меня есть список строк. Иногда строка может содержать определенный символ. Например, если у меня есть этот список:Удалить символ в строке

L=[dog,cat,tiger,,bear] 

Строка "tiger," имеет "," сцепляются со словом. Как удалить "," с "tiger,"?

+0

Термин 'L = [собака, кошка, тигр, медведь]' не является синтаксически действительным. Отсутствуют двойные кавычки или одинарные кавычки? –

+0

Предполагая, что вы исправите ошибку синтаксиса в своем списке, какие «конкретные символы» вы хотите удалить? И могут ли они встречаться где угодно в строке или просто в конце? – lurker

+0

Я извлекаю этот список терминов из текста. Но иногда я нахожу некоторые неправильные термины, подобные этому примеру. Эти условия встречаются в любом месте строки. –

ответ

1

Предикат ниже, fix_words(+WordsIn, -WordsOut), будет «исправлять» слова (термины) в WordsIn, давая WordsOut. «fix» означает, что ЛЮБЫЙ символ в слове, который не принадлежит, будет удален, независимо от того, где он встречается в слове (а не только в конце). Эта конкретная версия отвергает все, что не является алфавитом, но вы можете легко изменить его на все, что пожелаете, изменив условную проверку в remove_baddies/2.

fix_words([WordIn | WordsIn], [WordOut | WordsOut]) :- 
    fix_word(WordIn, WordOut), 
    fix_words(WordsIn, WordsOut). 
fix_words([], []). 

fix_word(WordIn, WordOut) :- 
    atom_chars(WordIn, CharsIn), 
    remove_baddies(CharsIn, CharsOut), 
    atom_chars(WordOut, CharsOut). 

remove_baddies([Char | CharsIn], [Char | CharsOut]) :- 
    (Char @>= 'A', Char @=< 'Z'; 
    Char @>= 'a', Char @=< 'z'), !, 
    remove_baddies(CharsIn, CharsOut). 
remove_baddies([_ | CharsIn], CharsOut) :- 
    remove_baddies(CharsIn, CharsOut). 
remove_baddies([], []). 

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

remove_baddies([',' | CharsIn], CharsOut) :- !, 
    remove_baddies(CharsIn, CharsOut). 
remove_baddies([Char | CharsIn], [Char | CharsOut]) :- 
    remove_baddies(CharsIn, CharsOut). 
remove_baddies([], []). 

выше использует только ISO предикаты (atom_chars/2). SWI Prolog и GNU Prolog могут предлагать некоторые встроенные модули, которые делают это немного проще для определения типа символа (, например, предикат char_type/2 SWI Prolog).