как использовать регулярные выражения для извлечения блоков текста без разделения текстовых блоков на строки [закрыто]

Я отправляю этот ответ, потому что мой интерфейс администратора Virtualmin / Webmin решил, что было бы неплохо отключить мой PHP-движок. Я нашел время, чтобы найти решение, поэтому я решил поделиться с ним вы, ребята:

Также не забудьте проверить, что ни один из ваших конфигурационных файлов вашего сайта, связанных с этим конкретным хостом или виртуальным хостом, не имеет в них php_admin_value, которые отключают PHP, например:

php_admin_value engine Off

В случае сомнений прокомментируйте это ...

# php_admin_value engine Off

И перезагрузите свой веб-сервер.

2
задан Nadia Santos 24 March 2019 в 20:45
поделиться

1 ответ

Ваш шаблон немного неправильный. Вам нужно экранировать [ и ] и не нужно экранировать @, поскольку @ не является специальным символом в регулярном выражении. Также для захвата содержимого между этими начальным и конечным тегами недостаточно ., поскольку он будет захватывать только один символ, поэтому вам нужно использовать осмотры вокруг и использовать .+? для захвата текста между ними не жадным образом. Попробуйте использовать это регулярное выражение,

(?<=\[@introS\]).+?(?=\[@introEnd@\])

Здесь, (?<=\[@introS\]) положительный взгляд позади гарантирует, что любой текст будет захвачен, предшествует в буквальном смысле [@introS] текст, а затем .+? захватывает любой один или несколько символов как меньше (?=\[@introEnd@\])

Online Demo

и, по возможности, положительный взгляд на будущее [1111]. ] Редактировать: [1130]

В вашем коде было несколько проблем.

  • Ваша декларация регулярного выражения была неправильной, так как строка не была заключена в кавычки, что я уже сказал, и вы исправили.
  • Вам нужно вызвать функцию read() для объекта file, чтобы извлечь строку из файла
  • . Вы можете просто использовать простой findall вместо сопоставления, когда сопоставление работает по-другому и пытается сопоставить полный текст с регулярным выражением
  • Вам нужно было использовать encoding="utf-8" для чтения / записи файла, поскольку файл содержит символы Юникода.

Вот обновленная рабочая копия вашего кода,

import re

def separate_chapters():
 pat = re.compile(r'(?<=\[@introS\]).+?(?=\[@introEnd@\])')
 with open('text1_scott.txt', 'r', encoding="utf-8") as file:
  for i in pat.findall(file.read()):
   print(i)
   inp = input("write text to a file? Y|N: ")
   if inp != "Y":
    continue

   file_name = input("Name of your file: ")

   with open(file_name, "w", encoding="utf-8") as out_file:
     out_file.write(i)
     print("text {} written to a file".format(i))


separate_chapters()

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

0
ответ дан Pushpesh Kumar Rajwanshi 24 March 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: