Удалить все реплики строки длиной более символов (регулярное выражение?)

Я не уверен, что регулярное выражение – лучший подход для этого, но, похоже, он довольно хорошо подходит. По существу, я сейчас разбираю некоторые pdf-файлы с помощью pdfminer, и недостатком является то, что эти pdf-файлы экспортируются слайдами PowerPoint, а это означает, что все анимации отображаются как довольно длинные копии строк. В идеале мне хотелось бы только одну копию каждой из этих строк вместо копии для каждого этапа анимации. Прямо сейчас текущий шаблон регулярного выражения, который я использую, таков:

re.sub(r"([\w^\w]{10,})\1{1,}", "\1", string) 

По какой-то причине, однако, это не изменяет входную строку. Я чувствую, что по какой-то причине python не распознает группу захвата, но я не уверен, как исправить эту проблему. Любые мысли оценили.

Примеры:

 I would like this text to be reduced I would like this text to be reduced 

вывод:

 I would like this text to be reduced 

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

One Solution collect form web for “Удалить все реплики строки длиной более символов (регулярное выражение?)”

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

Я думаю, что предложение Хосай может быть эффективным и умным, но я думаю, что у меня есть более простое и питоническое решение, хотя оно имеет свои пределы. Вы можете разделить строку на список строк и передать ее через set() :

 >>> s = """I would like this ... text to be ... ... reduced ... I would like this ... text to be ... ... reduced""" >>> print "\n".join(set(s.splitlines())) I would like this text to be reduced >>> 

Единственное, что с этим решением состоит в том, что вы потеряете исходный порядок строк (пример – пример довольно контрастного). Кроме того, если у вас есть одна и та же строка в двух разных контекстах, вы получите только одну строку.

  • Чтобы исправить первую проблему, вам, возможно, придется повторить итерацию по исходной строке во второй раз, чтобы вернуть ее в порядок или просто использовать упорядоченный набор .
  • Если у вас есть какой-либо символ, разделяющий каждый слайд, это поможет вам объединить только дубликаты, исправив вторую проблему этого решения.

В противном случае потребуется более сложный алгоритм, чтобы вы могли учитывать близость и контекст. Для этого суффиксное дерево может быть хорошей идеей, и для этого существуют библиотеки python (cf, что ответ SO ).

редактировать:

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

 >>> re.match(r"([\w \n]+)\n\1", string, re.MULTILINE).groups() ('I would like this\ntext to be\n\nreduced',) 

Хотя, afaict нотация \1 не является регулярным синтаксисом регулярных выражений в соответствующей части, а расширением. Но здесь уже поздно, и я тоже могу ошибаться. Может быть, я перечитаю эти курсы? 🙂

Я предполагаю, что автоматы pushdown от regexp способны выталкивать совпадения, потому что это только длинная многострочная строка, которую он может попсовать. Хотя я ожидаю, что у него будут побочные эффекты …

  • Pandas MultiIndex из регулярного выражения на столбце
  • Регулярные выражения и коды символов в данных экспорта Scrapy
  • Есть ли способ действительно рассортировать скомпилированные регулярные выражения в python?
  • Pymongo Regex $ все несколько поисковых запросов
  • Соответствие букв на любом языке
  • Сгенерируйте строку, которая соответствует RegEx в Python
  • Как преобразовать некоторый символ в пятизначный unicode в Python 3.3?
  • Почему этот фильтр Jinja nl2br исчезает, но не <p>?
  • Python - лучший язык программирования в мире.