2016-09-12 3 views
1

У меня есть JSON-файл, где я хранить отображение, которое содержит регулярные выражения, как те ниже:Python: чтение регэксп из JSON

"F(\\d)": "field-\\\\1", 
"FLR[ ]*(\\w)": "floor-\\\\1", 

Чтобы соответствовать стандарту убегает обратный слэш, то на самом деле регулярные выражения должны содержат \d, \w и \\1.

После того, как я прочитал этот JSON с помощью json.load(), мне все равно нужно отправить обработанный результирующий словарь, чтобы получить правильные регулярные выражения. Мне нужно заменить \\ на \. Каков наилучший способ этого?

До сих пор я пробовал как re.sub(), так и str.replace(), и в обоих случаях неясно, как представить одиночную обратную косую черту на подстанции.

Например, я не понимаю, почему следующее не производит один обратный слэш:

In [76]: "\\\\d".replace("\\\\", "\\") 
Out[76]: '\\d' 
+1

Это * делает * производит одиночную обратную косую черту. Вот как это отображается, чтобы было ясно, что это буквальная обратная косая черта, а не escape-символ. – jonrsharpe

ответ

1

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

Это может быть продемонстрировано путем проверки отдельных символов:

# In a terminal/REPL: 
>>>> "\\\\d".replace("\\\\", "\\")[0] 
'\\' 
>>>> "\\\\d".replace("\\\\", "\\")[1] 
'd' 
>>>> "\\\\d".replace("\\\\", "\\")[2] 
'd' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: string index out of range 

Один наконечник для выполнения регулярных выражений в Python: Используйте сырые строки. Если вы ставите r перед первой цитатой строкового литерала, обратная косая черта ничего не сможет избежать (кроме конечной цитаты). r"\n" - строка, содержащая два символа, \ и номер n, что эквивалентно "\\n". При работе с регулярными выражениями и другими вещами, где вам нужно отправлять escape-последовательности, они очень полезны. См. Также: What exactly do “u” and “r” string flags do in Python, and what are raw string literals?

+0

Имеет смысл, у меня все еще есть проблема с тем, чтобы эти регулярные выражения работали. Например: 'В [24]: re.sub (" F (\\ d) "," field - \\\\ 1 "," F1 ") Out [24]: 'field - \\ 1'' –

+0

@NikolayDerkach Кажется, что он работает точно так, как должен. Этот вызов разрешает «в строке» «F1» ', заменяет все вхождения' 'F '', за которым следует одна цифра с полем '' ", за которым следует обратная косая черта, а затем' '1" '. И это то, что он делает. Средний аргумент сбрасывается один раз, поэтому 're' видит две обратные косые черты, которые ускользают, чтобы вызвать обратную косую черту. Если вы хотите сослаться на группу 1, это будет поле '' - \\ 1. –

+0

@NikolayDerkach Совет для выполнения регулярных выражений в python: используйте необработанные строки. Если вы поместите 'r' перед первой цитатой строкового литерала, обратная косая черта ничего не сможет избежать (кроме конечной цитаты). 'r" \ n "" - это строка, содержащая два символа, обратная косая черта и n, эквивалентная '' \\ n "'. При работе с регулярными выражениями и другими вещами, где вам нужно отправлять escape-последовательности, они очень полезны. Я редактирую это в ответ. –