Условное удаление периода в сокращениях, но не по предложению, заканчивающемуся регулярным выражением python - PullRequest
3 голосов
/ 11 июля 2019

У меня есть несколько предложений с аббревиатурами. Цель состоит в том, чтобы удалить ., если оно появляется в аббревиатуре, такой как «США», но не в том случае, если это обычное окончание предложения сигнала периода. В частности, следующие тестовые документы

docs = ['U.S.S.R. line-continued', 'u.s.s.r. line-continued', 'U.S.S.R. Title Case', 'end-of-sentence. New-sentence', 'end-of-sentence.']

следует преобразовать в

['USSR line-continued', 'ussr line-continued', 'USSR Title Case', 'end-of-sentence. New-sentence', 'end-of-sentence.']

Я пытался что-то вроде

[re.sub(r"((\w)\.){2,}", r"\1", doc) for doc in docs]

, который сохраняет символы, если шаблон "символ-за-периодом" встречается более одного раза. Но это не работает.

Это работает

[re.sub(r"(\w)\.(\w)\.(\w)?\.?(\w)?\.?", r"\1\2\3\4", doc) for doc in docs]

но это не обобщает, если у меня есть пять или более символов с точками.

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

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

import re
docs = ['U.S.S.R. line-continued', 'u.s.s.r. line-continued', 'U.S.S.R. Title Case', 'end-of-sentence. New-sentence', 'end-of-sentence.']
print ([re.sub(r"(?<!\w)([A-Za-z])\.", r"\1", doc) for doc in docs])

Вывод:

['USSR line-continued', 'ussr line-continued', 'USSR Title Case', 'end-of-sentence. New-sentence', 'end-of-sentence.']
1 голос
/ 11 июля 2019

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

((?:\w\.){2,})

Тест с re.findall

import re

regex = r"((?:\w\.){2,})"

test_str = "docs = ['U.S.','U.S.S.R. line-continued', 'u.s.s.r. line-continued', 'U.S.S.R. Title Case', 'end-of-sentence. New-sentence', 'end-of-sentence.','U.S.S.R.U.S.S.R.U.S.S.R.U.S.S.R. line-continued']"

print(re.findall(regex, test_str))

Вывод

['U.S.', 'U.S.S.R.', 'u.s.s.r.', 'U.S.S.R.', 'U.S.S.R.U.S.S.R.U.S.S.R.U.S.S.R.']

Тест с re.finditer

import re

regex = r"((?:\w\.){2,})"

test_str = "docs = ['U.S.','U.S.S.R. line-continued', 'u.s.s.r. line-continued', 'U.S.S.R. Title Case', 'end-of-sentence. New-sentence', 'end-of-sentence.','U.S.S.R.U.S.S.R.U.S.S.R.U.S.S.R. line-continued']
"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

Выражение объяснено на верхней правой панели этой демонстрации , если вы хотите изучить / упростить / изменить ее, ив этой ссылке , вы можете посмотреть, как она будет шаг за шагом сопоставляться с некоторыми примерами входных данных, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...