Python регулярное выражение для нескольких и одиночных точек - PullRequest
1 голос
/ 27 апреля 2019

Я сейчас пытаюсь почистить 1-граммовый файл.Вот некоторые из следующих слов:

  1. word - базовое слово, классический случай
  2. word. - базовое слово, но с точкой
  3. w.s.f.w. - (слово означает слово) - правильная аббревиатура
  4. w.s.f.w - неправильная аббревиатура (отсутствует последняя точка)

Моя текущая реализация рассматривает два разных RegExes, потому что я неудалось объединить их в одну.Первый RegEx распознает основные слова:

find_word_pattern = re.compile(r'[A-Za-z]', flags=re.UNICODE)

Второй используется для распознавания аббревиатур:

find_acronym_pattern = re.compile(r'([A-Za-z]+(?:\.))', flags=re.UNICODE)

Допустим, у меня есть input_word как последовательность символов,Вывод получается с помощью:

"".join(re.findall(pattern, input_word))

Затем я выбираю, какой вывод использовать на основе длины: чем длиннее вывод, тем лучше.Моя стратегия хорошо работает с делом нет.1, где оба шаблона возвращают одинаковую длину.

Дело №.2 проблематично, потому что мой подход выдает word. (с точкой), но мне нужно, чтобы он возвратил word (без точки).В настоящее время дело решено в пользу find_acronym_pattern, что дает более длинную последовательность.

Дело №.3 работает как положено.

Дело №.4: find_acronym_pattern пропускает последний символ, означающий, что он производит w.s.f., тогда как find_word_pattern производит wsfw.

Я ищу RegEx (предпочтительно один вместо двух, которые используются в настоящее время), который:

  1. учитывая word возвращает word

  2. учитывая word. возвращает word

  3. дано w.s.f.w. возвращено w.s.f.w.

  4. дано w.s.f.w возвращено w.s.f.w.

  5. дано m.in возвращено m.in.

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

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

((?:[A-Za-z](\.))*[A-Za-z]+)\.?

И заменить на:

\1\2

Regex demo .

Пример Python 3:

import re

regex = r"((?:[A-Za-z](\.))*[A-Za-z]+)\.?"
test_str = ("word\n" "word.\n" "w.s.f.w.\n" "w.s.f.w\n" "m.in")
subst = "\\1\\2"

result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

Вывод:

word
word
w.s.f.w.
w.s.f.w.
m.in.

Python demo .

2 голосов
/ 27 апреля 2019

Регулярное выражение никогда не вернет то, чего нет, поэтому вы можете забыть о требовании 5. Что вы можете сделать, так это всегда отбросить последний период и добавить его обратно, если результат содержит вложенные периоды. Это даст вам желаемый результат, и это довольно просто:

found = re.findall(r"\w+(?:\.\w+)*", input_word)[0]
if "." in found:
    found += "."

Как видите, я соответствую слову и любому числу суффиксов ".part". Как и ваша версия, она соответствует не только однобуквенным аббревиатурам, но и более длинным аббревиатурам, таким как Ph.D., Prof.Dr. или что-либо еще.

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