Экранирование двойных кавычек в регулярном выражении в JSON, чтение до Python - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть JSON файл, который содержит строковые ключи, с регулярными строками в качестве значений:

{
    "GitHub": "[g|G][i|I][t|T][h|H][u|U][b|B]['|\"][\s]?[:|=]?[\s]?['|\"][0-9a-zA-Z]{35,40}['|\"]"
} 

Затем файл читается в Python:

with open(args.rules, "r") as ruleFile:
    rules = json.loads(ruleFile.read())
...

К сожалению, я не могу заставить регулярное выражение разобрать правильно. Кажется, я все время зацикливаюсь на том, как мне избежать двойных кавычек в регулярном выражении. Поскольку код в настоящее время написан, интерпретированное регулярное выражение удаляет обратную косую черту sh, которую я использую для экранирования каждой двойной кавычки; Я считаю, что backsla sh экранирует двойные кавычки в JSON (он предназначен только для экранирования двойных кавычек для самого регулярного выражения), что приводит к сбою кода при чтении файла.

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

С учетом желаемой конечной строки регулярного выражения, как следует обновлять регулярное выражение, чтобы одновременно удовлетворять как синтаксис JSON, так и синтаксис Python?

1 Ответ

0 голосов
/ 17 апреля 2020

Превращение комментариев в ответ:

Во-первых, я не думаю, что ваше регулярное выражение - это то, с чего вы ожидаете начать, оно будет соответствовать: GiT|ub"|'mriDyPKFoVKH7WbvQM3qrjH1LvtYuDYuB6Q' Вы должны удалить или (|) внутри классов символов ([]), как это интерпретируется как буквальная вертикальная черта.

Если вы добавите флаг игнорирования, то ваше регулярное выражение может быть github['"][\s]?[:=]?[\s]?['"][0-9a-z]{35,40}['"], что немного лучше: (пример github"= 'i50phsj4vk5p5hphbat9k63ug2njca1f918zzha", хотя первая кавычка после "github" (перед = или :) кажется странной.

В общем, вы можете просто начать с того, что вы хотите в python, а затем повернуть его вспять.

$ python
>>> import json, re
>>> desired = r'''github['"][\s]?[:=]?[\s]?['"][0-9a-z]{35,40}['"]'''
>>> example = "giThuB' ='0123456789012345678901234567890123456789'"

>>> print desired
github['"][\s]?[:=]?[\s]?['"][0-9a-z]{35,40}['"]

>>> print json.dumps({"Github": desired})
{"Github": "github['\"][\\s]?[:=]?[\\s]?['\"][0-9a-z]{35,40}['\"]"}

>>> bool(re.match(desired, example, flags=re.I))
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...