Извлечение целых слов

У меня есть большой набор текста в реальном мире, который мне нужно вытащить из слов для ввода в проверку орфографии. Я бы хотел извлечь как можно больше значимых слов без излишнего шума. Я знаю, что здесь много ниндзя регулярного выражения, так что, надеюсь, кто-то может мне помочь.

В настоящее время я извлекаю все алфавитные последовательности с помощью '[az]+' . Это хорошее приближение, но оно тянет с собой много мусора.

В идеале я хотел бы, чтобы некоторое регулярное выражение (не должно быть довольно или эффективным), которое извлекает все алфавитные последовательности, разделенные естественными разделителями слов (например, [/-_,.: ] и т. Д.) И игнорирует любые алфавитные последовательности с незаконными границами ,

Тем не менее, я был бы счастлив просто получить все алфавитные последовательности, которые НЕ примыкают к числу. Так, например, 'pie21' НЕ извлекает 'pie' , но 'http://foo.com' будет извлекать ['http', 'foo', 'com'] .

Я попробовал lookbehind и lookbehind , но они были применены для каждого символа (так, например, re.findall('(?<!\d)[az]+(?!\d)', 'pie21') вернет 'pi' когда я хочу, чтобы он ничего не возвращал». Я попробовал обернуть альфа-часть как термин ( (?:[az]+) ), но это не помогло.

Более подробная информация: данные представляют собой базу данных электронной почты, поэтому в основном это обычный английский с нормальными номерами, но иногда есть строки с мусором, такие как GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA и AC7A21C0 которые я бы полностью проигнорировал. Я предполагаю, что любая алфавитная последовательность с номером в нем является мусором.

    3 Solutions collect form web for “Извлечение целых слов”

    Если вы ограничиваете себя буквами ASCII, используйте (с опцией re.I )

     \b[az]+\b 

    \b – якорь границы слова, соответствующий только в начале и конце буквенно-цифровых слов. Итак, \b[az]+\b соответствует pie , но не pie21 или 21pie .

    Чтобы разрешить другие буквы, отличные от ASCII, вы можете использовать что-то вроде этого:

     \b[^\W\d_]+\b 

    который также позволяет использовать акцентированные символы и т. д. Возможно, вам нужно будет установить параметр re.UNICODE , особенно при использовании Python 2, чтобы разрешить \w стенограмму соответствовать буквам, отличным от ASCII.

    [^\W\d_] в качестве отрицательного символьного класса допускает любой буквенно-цифровой символ, за исключением цифр и подчеркивания.

    Вы знакомы с границами слов? ( \b ). Вы можете извлечь слово с помощью \b вокруг последовательности и сопоставить алфавит внутри:

     \b([a-zA-Z]+)\b 

    Например, это захватывает целые слова, но останавливается на токенах, таких как дефисы, периоды, полуколоны и т. Д.

    Вы можете \b последовательность и другие, в руководстве python

    EDIT Кроме того, если вы смотрите на число, следующее или предшествующее совпадению, вы можете использовать отрицательный прогноз вперед / назад:

     (?!\d) # negative look-ahead for numbers (?<!\d) # negative look-behind for numbers 

    Как насчет:

     import re yourString="pie 42 http://foo.com GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA pie42" filter (lambda x:re.match("^[a-zA-Z]+$",x),[x for x in set(re.split("[\s:/,.:]",yourString))]) 

    Обратите внимание, что:

    • split разбивает вашу строку на потенциальных кандидатов => возвращает список «потенциальных слов»,
    • set делает unicity filtering => преобразует список в набор, таким образом удаляя записи, появляющиеся более одного раза. Этот шаг не является обязательным.
    • фильтр уменьшает количество кандидатов: берет список, применяет тестовую функцию к каждому элементу и возвращает список элемента, следующего за тестом. В нашем случае тестовая функция является «анонимной»,
    • lambda: анонимная функция, взятие элемента и проверка, если это слово (только верхние или нижние буквы)

    EDIT : добавлены некоторые пояснения

    Python - лучший язык программирования в мире.