Регулярное выражение для удаления точек в сокращениях?

#python #regex

#python #регулярное выражение

Вопрос:

Я хочу удалить точки в сокращениях из строки текста, но я также хочу оставить обычные точки (например, в конце предложения) в такте.

Итак, следующее предложение:

 "The C.I.A. is a department in the U.S. Government."
  

Должно стать

 "The CIA is a department in the US Government."
  

Есть ли чистый способ сделать это с помощью Python? Пока у меня двухэтапный процесс:

 words = "The C.I.A. is a department in the U.S. Government."
words = re.sub(r'([A-Z].[A-Z.]*).', r'1', words)
print words
# The C.I.A is a department in the U.S Government.    
words = re.sub(r'.([A-Z])', r'1', words)
print words
# The CIA is a department in the US Government.
  

Комментарии:

1. Могут ли быть какие-либо однобуквенные сокращения?

2. Как насчет etc. ? Если вас интересуют только одиночные буквы верхнего регистра, за которыми следует точка, вы можете использовать re.sub(r'b([A-Z]).', r'1', words) , но это не общее решение.

3. Это сводится к вопросу «откуда вы знаете, что что-то является синонимом, а не предложением?» Как только у вас будет ответ на этот вопрос, вы можете начать создавать регулярное выражение.

4. Каковы точные правила сопоставления? Это всего лишь небольшой пример того, чего вы действительно пытаетесь достичь? Вы имеете дело с несколькими блоками текста, где в конечном итоге вы просто пытаетесь удалить точки из всего, что квалифицируется как сокращение?

5. Итак, вы пытаетесь де-нью-йоркизировать какую-то прозу? То есть, удалить сумасшедшие точки, которые The New Yorker и NYT (или N.Y.T. они бы назвали это) настаивают на введении сокращений и инициализмов? Вам понадобятся дополнительные тесты, например: The C.I.A. is a department in the U.S. Government. That is to say, the U.S. govt. has a dept. called the C.I.A. The Man From U.N.C.L.E. does not work there, he works for U.N.C.L.E. Tricky for an R.E.: "U.N.C.L.E." *is* properly spelled with the periods, both in N.Y. and elsewhere. Of course Y.M.M.V. (Unless you're the N.Y.T.) So says I.

Ответ №1:

Вероятно, это?

 >>> re.sub(r'(?<!w)([A-Z]).', r'1', s)
'The CIA is a department in the US Government.'
  

Замените одиночные точки, которым предшествует одиночная буква в верхнем регистре, при условии, что этой единственной букве непосредственно не предшествует ничего из w набора символов. Последнему критерию соответствует отрицательное утверждение lookbehind (?<!w) .

Комментарии:

1. Любопытно узнать, по-прежнему ли OP пытается обрабатывать такие вещи, как etc. . В остальном это работает хорошо.

2. Возможно, вы захотите также объяснить код. На самом деле это также не выполняется для I. в предложении.

3. @PadraicCunningham Ах да. Добавлено некоторое объяснение. Не уверен, I. будет ли считаться акронимом, возможно, аббревиатурой.

4. @PadraicCunningham В настоящее время я ищу, есть ли у NLTK уже способ справиться с этим, но пока ничего.

5. @PadraicCunningham Я нашел единорога и, к счастью, в списке рассылки Python :)) Наиболее очевидным осложнением является обработка точек и без точек I. , отсюда