#php #html #regex #preg-replace
#php #HTML #регулярное выражение #preg-заменить
Вопрос:
Я импортировал текстовую версию PDF с помощью скрипта Python, но в нем есть куча артефактов мусора, которые меня просто не волнуют.
Единственные пробелы, о которых я забочусь, это (1) одинарные пробелы и (2) двойные символы n.
Один пробел, по очевидным причинам, между границами слов. Двойные n, для разграничения между абзацами.
Содержащийся в нем мусорный пробел выглядит следующим образом:
[ nt] all jumbled together
Что приводит меня к другой проблеме, иногда абзацы разграничены
[n][s] [n]
У меня недостаточно опыта работы с регулярным выражением, чтобы заставить его игнорировать внутренний пробел между двумя n
. Как любитель регулярного выражения, моя проблема в том, что s
включает n
.
Если бы этого не произошло — я думаю, это было бы действительно простой проблемой для решения.
Все остальные пробелы не имеют значения, и ничего из того, что я пытаюсь, на самом деле не работает.
Любые предложения будут высоко оценены.
Пример текста
Summary: The Department of Environment in Bangladesh seized 265 sacks of poultry feed
tainted with tannery waste and various chemicals.
Synthesis/Analysis: The Department of Environment seized the tainted poultry feed on
28 March from a house in the city of Adabar located in Dhaka province. Workers were
found in the house, which was used as an illegal factory, producing the tainted feed. The
Bangladesh Environment Conservation Act allowed for a case to be filed against the
factory’s manager, Mahmud Hossain, and the owner, who was not named.
It was reported that the Department of Environment had also closed three other factories
in Hazaribag a month prior to this instance for the same charges. The Bangladesh Council of
Scientific and Industrial Research found that samples from the feed taken from these
factories had “dangerous levels of chromium…” The news report also stated that “poultry
6
and eggs became poisonous” from consuming the tainted feed, which would also cause
health concerns for consumers.
Это просто приводит меня к большему количеству исправлений… Нужно удалить все номера страниц и случайные двойные n.
Комментарии:
1. Посмотрите на количество заданных вами вопросов о регулярных выражениях. Как вы думаете, стоило бы потратить ваше время (и наше), если бы вы начали серьезно изучать их? Это не так сложно, если вы внимательно прочитаете книгу OReilly Regex.
2. Спасибо за твой комментарий, Майк. Я рад, что регулярное выражение легко для вас.
3. Комментарий Майка был правильным. Если вам приходится задавать так много вопросов, возможно, вам следует изучить предмет вместо того, чтобы продолжать просить людей что-то делать для вас. Мне самому нравится поваренная книга регулярных выражений.
Ответ №1:
Вы можете использовать утверждение, чтобы s
исключить разрывы строк:
((?!n)s){2,}
Чтобы объединить строки с ns n
пробелами между ними, вы можете использовать аналогичную конструкцию вместо s
. Но для простоты я бы просто использовал два preg_match
и сначала объединил бы разрывы строк, а затем убрал двойные пробелы.
Комментарии:
1. Я никогда не слышал об этом утверждении, сейчас я гуглю его для получения дополнительных объяснений по этому поводу!
2. Извините, забыл ссылку: regular-expressions.info/lookaround . html имеет понятное введение в lookahead и за утверждениями и ?! отрицательные варианты.
3. Это то, что я использовал в итоге
$find[5]='/[s]*((?!n)s){2,}[s]*/'; $fix[5]='<br/><br/>';
4. @mario как можно сделать то же самое, но для защиты пробелов внутри
<pre>
тегов?5. @Lea: Разделите эти области заранее.
Ответ №2:
Я думаю, это сработает:
-
Замените » s * n s *» на » n n».
Это позволит стандартизировать разделители абзацев.
-
Замените » s * s *» на «».
Это позволит стандартизировать разделители слов.
Ответ №3:
s/(h) /$1/g;
s/n(s*n) /nn/g;
Вышеописанное приведет к удалению горизонтальных пробелов (я предполагаю, что вы не беспокоитесь о вертикальной табуляции или возврате каретки) и всех новых строках через двойной пробел.
Ответ №4:
Немного халтурно, но я думаю, это должно сработать:
preg_replace('/t|( ){2,}|(n)s (n)/', '123', $data);
Бонус: не требует выполнения двух проходов по строке.
Комментарии:
1. 1 2 3 — это просто трюк для замены правой части строки. Есть шанс, что вы могли бы загрузить некоторые тестовые данные? Сложно сделать это правильно, не имея возможности попробовать это должным образом
2. Конечно… Это гигантский файл… Итак, я просто опубликую немного об этом
3. Я думаю, что Stack Overflow также очищает файл, когда я его публикую. Хаха