Как правильно экранировать зарезервированные символы регулярных выражений в JSON? - PullRequest
3 голосов
/ 10 июля 2019

У меня есть файл JSON, который содержит некоторые выражения регулярных выражений, которые я хочу использовать в своем коде Python. Проблема возникает, когда я пытаюсь экранировать зарезервированные символы регулярных выражений в файле JSON. Когда я запускаю код на python, он не может обработать файл json и выдает исключение.

Я уже отладил код и пришел к выводу, что он не работает при вызове json.loads(ruleFile.read()). Очевидно, в JSON можно экранировать только некоторые символы, и точка не является одним из них, что вызывает синтаксическую ошибку.

try:
    with open(args.rules, "r") as ruleFile:
        rules = json.loads(ruleFile.read())
        for rule in rules:
            rules[rule] = re.compile(rules[rule])
except (IOError, ValueError) as e:
    raise Exception("Error reading rules file")
{
    "Rule 1": "www\.[a-z]{3,10}\.com"
}
Traceback (most recent call last):
  File "foo.py", line 375, in <module>
    main()
  File "foo.py", line 67, in main
    raise Exception("Error reading rules file")
Exception: Error reading rules file

Как мне обойти эту проблему синтаксиса JSON?

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Правило должно сначала иметь правильную строку в правильном словаре.И \ должны быть экранированными в Python.

Поэтому вы должны сначала написать:

rules = {"Rule 1": r"www\.[a-z]{3,10}\.com"}

Затем вы можете легко преобразовать это в строку JSON:

print(json.dumps(rules, indent=4))

{
    "Rule 1": "www\\.[a-z]{3,10}\\.com"
}

Теперь вы знаете, как должен форматироваться файл json, содержащий регулярные выражения.

0 голосов
/ 10 июля 2019

Обратная косая черта должна быть экранирована в JSON.

{
    "Rule 1": "www\\.[a-z]{3,10}\\.com"
}

С здесь :

Следующие символы зарезервированы в JSON и должны быть правильно экранированный для использования в строках:

  • Backspace заменяется на \ b
  • Подача формы заменена на \ f
  • Новая строка заменена на \ n
  • Возврат каретки заменен на * r
  • Вкладка заменена на \ t
  • Двойная кавычка заменяется на \ "
  • Обратная косая черта заменена на \\
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...