Удаление пунктуации из уникальных строк во входном файле

Этот вопрос ( Лучший способ удалить знаки препинания из строки в Python ) занимается удалением пунктуации из отдельной строки. Однако я надеюсь прочитать текст из входного файла, но распечатать только ОДНУ КОПИЮ всех строк без окончания пунктуации. Я начал что-то вроде этого:

f = open('#file name ...', 'a+')
for x in set(f.read().split()):
    print x

Но проблема в том, что если во входном файле есть, например, такая строка:

This is not is, clearly is: weird

Он обрабатывает три разных случая «есть» по-разному, но я хочу игнорировать любую пунктуацию и напечатать «есть» только один раз, а не три раза. Как удалить любые конечные знаки препинания, а затем поместить полученную строку в набор?

Спасибо за любую помощь. (Я действительно новичок в Python.)


person user16647    schedule 22.06.2012    source источник
comment
Вы уверены, что хотите открыть файл в режиме a+? r должно быть достаточно.   -  person Matthias    schedule 22.06.2012
comment
Вы правы, что r достаточно, однако я надеюсь позже добавить в файл, чтобы я мог поставить + там для будущих целей.   -  person user16647    schedule 22.06.2012


Ответы (2)


import re

for x in set(re.findall(r'\b\w+\b', f.read())):

должны быть более способны правильно различать слова.

Это регулярное выражение находит компактные группы буквенно-цифровых символов (az, A-Z, 0-9, _).

Если вы хотите найти только буквы (без цифр и без подчеркивания), замените \w на [a-zA-Z].

>>> re.findall(r'\b\w+\b', "This is not is, clearly is: weird")
['This', 'is', 'not', 'is', 'clearly', 'is', 'weird']
person eumiro    schedule 22.06.2012
comment
Спасибо за подсказку про регуляры, не знал о них. - person user16647; 22.06.2012

Вы можете использовать таблицы перевода, если вам не нужно заменять знаки препинания пробелами, например.

>>> from string import maketrans
>>> punctuation = ",;.:"
>>> replacement = "    "
>>> trans_table = maketrans(punctuation, replacement)
>>> 'This is not is, clearly is: weird'.translate(trans_table)
'This is not is  clearly is  weird'
# And for your case of creating a set of unique words.
>>> set('This is not is  clearly is  weird'.split())
set(['This', 'not', 'is', 'clearly', 'weird'])
person Christian Witts    schedule 22.06.2012