python — Функция для разбора слов из строки без использования пробелов
Задать вопрос
спросил
Изменено 7 лет, 6 месяцев назад
Просмотрено 2к раз
\$\начало группы\$
Я пытаюсь разобрать слова из сильно искаженного текстового файла, который содержит много повторов. Он имеет длину около 100 тыс. символов и был сформирован путем объединения множества подстрок в алфавитном порядке.
Меня интересуют другие методы поиска слов без использования пробелов.
по определению unique_words (строка): слова = дикт() p1 = 0 # Позиция среза строки 1 p2 = 1 # Позиция среза строки 2 len_string = len(строка) в то время как p2 < len_string: р2 += 1 sub1 = string[p1:p2] # Более короткая подпрограмма sub2 = string[p1:(p2 + 1)] # Более длинный вложенный элемент sub1_count = string.count(sub1) # Подсчитывает частоту более короткого сабвуфера sub2_count = string.count(sub2) # Подсчитывает частоту более длинного сабвуфера if sub2_count * len(sub2) < sub1_count * len(sub1): # Истинно, если частота sub1 * его длина больше words[sub1] = ('') # Добавить р1 = р2 обратные слова
Приведенный выше код работает, когда количество уникальных слов мало, но не работает, когда оно велико. Я использовал веб-сайт TextMechanic для генерации случайной строки, например
'вверх внизвлевовнизвнизвлевовверхвлевовправовнизвлевовверх'
, и приведенный выше код возвращает словарь точно так, как нужно:
{'вверх': '', 'вниз': '', 'влево': '', 'вправо': ''}
Вот проблема:
Когда количество уникальных слов увеличивается, существует точка, в которой появление одиночных букв приводит к общему количеству символов любого слова в строке.
Мое текущее решение использует алгоритм на коротких фрагментах исходной строки, но это требует проб и ошибок и содержит артефакты.
- питон
- строки
- разбор
\$\конечная группа\$
3
\$\начало группы\$
Отказ от ответственности: я не совсем уверен, как это должно работать, и, насколько я могу судить, приведенный вами пример неверен. Действительно, у меня нет «правильно» в выводе. Я попробую дать вам несколько советов в любом случае.
Используйте соответствующий тип
Вы сохраняете подстроки в словаре с бесполезным связанным значением. Похоже, вы хотите использовать набор
.
слов = установить() ... слова.добавить(sub1)
Не используйте можно использовать: Для последнего легко увидеть различные значения, которые примет Кроме того, я предполагаю, что вы делаете одну бессмысленную итерацию в конце. Действительно, у вас был более правильным. Кроме того, мой инстинкт подсказывает мне, что начинать с 1 не так уж и глупо, но у меня нет для этого веских причин. \$\конечная группа\$ \$\начало группы\$ Вы должны дать своим переменным более подходящие имена. Например, хотя вы можете знать, что делает переменная Вместо использования функции Наконец, вам не нужны круглые скобки вокруг в то время как
, когда для
делает свое дело
len_string = len(строка)
в то время как p2 < len_string:
р2 += 1
... то, что не меняет p2
для p2 в диапазоне (2, 1+len(строка)):
. .. то, что не меняет p2
p2
. Это также более лаконично и более идиоматично. sub1 == sub2
и дальше в принципе ничего не происходит. Я бы не удивился, если бы: для p2 в диапазоне (2, len (строка)):
p1
или p2
, люди, читающие ваш код, этого не знают. Присвоение вашим переменным лучших имен также снижает потребность во встроенных комментариях, таких как # String slice position 2
. dict
для инициализации пустого словаря вы можете просто ввести следующее: words = {}
. ''
в words[sub1] = ('')
. Его можно изменить на следующее: слов[sub1] = ''
\$\конечная группа\$
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
.JavaScript 2.0 Лексер
JavaScript 2.0 ЛексерАпрель 2002 г. Проект JavaScript 2.0 Базовый язык Лексер |
Понедельник, 26 ноября 2001 г.
В этом разделе представлен неофициальный обзор лексера JavaScript 2.0. Посмотреть этапы и разделы лексической семантики в формальном описании главу для подробностей.
Изменения по сравнению с JavaScript 1.5
Лексер JavaScript 2.0 ведет себя так же, как лексер JavaScript 1.5, за исключением следующего:
- Есть дополнительные знаки препинания и зарезервированные слова.
- Лексер распознает несколько незарезервированных слов, которые имеют особое значение в некоторых контекстах, но могут использоваться в качестве идентификаторов.
- За цифрами могут следовать единицы измерения.
- Лексер обрабатывает только вставку точки с запятой в разрывы строк; синтаксический анализатор JavaScript 2.0 позволяет опускать точки с запятой
до закрытия
}
. Кроме того, синтаксический анализатор JavaScript 2.0 позволяет использовать точку с запятой. опущен перед операторомelse
оператораif
-else
и передв то время как
изделают
-в то время как
заявление. - Вставка точки с запятой на разрывах строк отключена в строгом режиме.
- [без разрыва строки] ограничения в грамматических постановках игнорируются в strict режим.
Исходный код
Исходный текст JavaScript 2.0 состоит из последовательности версии Unicode UTF-16 2.1 или более поздние символы, нормализованные к Unicode Normalized Form C (каноническая композиция), как описано в Unicode Технический отчет №15.
Комментарии и пробелы
Комментарии и пробелы ведут себя так же, как в JavaScript 1.5.
Пунктуаторы
Следующие токены пунктуации JavaScript 1.5 распознаются в JavaScript 2.0:
!
!=
!==
%
%=
и
&&
&=
(
)
*
*=
+
++
+=
,
-
-
-=
.
/ 9=
||=
Ключевые слова
Следующие зарезервированные слова используются в JavaScript 2.0:
абстрактный
как
перерыв
корпус
улов
класс
const
продолжить
по умолчанию
удалить
сделать
еще
экспорт
расширяет
ложь
окончательный
окончательный
для
функция
если
реализует
импорт
в
экземпляр
интерфейс
это
пространство имен
новое
пустое
пакет
частный
общедоступный
возврат
статический
супер
переключатель
это
бросок
верно
попытка
тип
использовать
var
недействительно
в то время как
с
Следующие зарезервированные слова зарезервированы для расширения в будущем:
отладчик
enum
перейти к
реализует
интерфейс
собственный
защищенный
синхронизированный
бросает
переходный
изменчивый
Следующие слова имеют особое значение в некоторых контекстах JavaScript 2. 0, но не зарезервированы и могут использоваться как идентификаторы:
исключить
получить
включить
названный
набор
Любое из приведенных выше ключевых слов можно использовать в качестве идентификатора, включив escape-последовательность \_
в любом месте идентификатора,
что лишает его любых значений ключевых слов. Двух- и четырехзначные шестнадцатеричные escape-последовательности \x dd
и \и дддд
также может использоваться в идентификаторах; они также лишают идентификатор любых значений ключевых слов.
Отличия от JavaScript 1.5
Следующие слова были зарезервированы в JavaScript 1.5, но не зарезервированы в JavaScript 2.0:
логическое значение
байт
символ
двойной
плавающий
целочисленный
длинный
короткий
Следующие слова не были зарезервированы в JavaScript 1. 5, но зарезервированы в JavaScript 2.0:
как
равно
пространство имен
использование
Вставка точки с запятой
Синтаксическая грамматика JavaScript 2.0 явно делает точки с запятой необязательными в следующих ситуациях:
- Перед любым
}
- Перед
иначе
изесли
-иначе
заявление - Перед
в то время как
изсделать
-в то время как
оператор (но не перед, а
операторав то время как
) - До окончания программы
В таких ситуациях точки с запятой необязательны, даже если они создают пустые операторы. Строгий mode не влияет на вставку точки с запятой в вышеуказанных случаях.
Кроме того, иногда разрывы строк во входном потоке превращаются в токены VirtualSemicolon. В частности, если первые n th токены формы программы JavaScript грамматически допустимы но с первого по n +1 st токенов нет и есть разрыв строки (или комментарий, включающий строку break) между токенами n th и токенами n +1 st , то синтаксический анализатор пытается разобрать программа снова после вставки токена VirtualSemicolon между n th и токены n +1 st . Этот тип вставки VirtualSemicolon не происходит в строгом режиме.
См. также обоснование синтаксиса вставки точки с запятой.
Литералы регулярных выражений
Литералы регулярных выражений начинаются с символа косой черты ( /
), за которым сразу не следует еще одна косая черта (два
слэши начинают строчный комментарий). Как и в JavaScript 1.5, литералы регулярных выражений неоднозначны с делением ( /
)
или деление-назначение ( /=
) токены. Лексер обрабатывает /
или /=
как деление или присваивание деления.
токен, если любой из этих токенов будет разрешен синтаксической грамматикой в качестве следующего токена; в противном случае лексер обрабатывает /
или /=
как начало регулярного выражения.
Эта досадная зависимость лексического разбора от грамматического разбора унаследована от JavaScript 1.5. Видеть обоснование синтаксиса регулярного выражения для обсуждения вопросы.
Единицы
Если за числовым литералом сразу следует идентификатор, лексер преобразует идентификатор в строковый литерал. Затем синтаксический анализатор обрабатывает число и строку как единичное выражение. Идентификатор не может начинаться со знака подчеркивания, но есть нет ограничений на зарезервированные слова для идентификатора; любой идентификатор, начинающийся с буквы, будет работать, даже если он зарезервирован слово.
Например, 3 дюйма
преобразуется в 3 дюйма
. 5xena
преобразуется в 5 "xena"
.
С другой стороны, 0xena
преобразуется в 0xe "na"
. Неразумно определять имена юнитов, которые начинаются
с буквами e
или E
либо отдельно, либо с последующей десятичной цифрой, или x
или X
за которым следует шестнадцатеричная цифра из-за потенциальных неоднозначностей с экспоненциальной или шестнадцатеричной нотацией.