Регулярное выражение и Восьмеричные символы


Я пытаюсь написать регулярное выражение, которое захватывает восьмеричные символы.

Например, если строка, которую я сравниваю с моим регулярным выражением:

char x = '77';

Я хочу, чтобы мое регулярное выражение захватило '77'

Я попытался сделать это через модуль re и регулярное выражение вида:

"'\[0-7]{1-3}'"
Но это не захватывает восьмеричный символ. Как можно идентифицировать восьмеричные символы с помощью регулярных выражений в Python?

Правка:

В качестве примера того, что я имею в виду, рассмотрим C код:

char x = '77'; 
printf("%c", x);

Я хотел бы захватить '77' с первой строки.

Правка:

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

Например, оба они решают задачу:

regex = re.compile(r"s*("                  
                        r"'\0[0-7]{1,2}'"          # octal
                        "|[a-zA-Z_][a-zA-Z_d]*"    # identifer
                        ")")
regex.findall(line)

И

regex = re.compile(r"s*("                  
                        "'\\0[0-7]{1,2}'"         # octal
                        "|[a-zA-Z_][a-zA-Z_d]*"    # identifer
                        ")")
regex.findall(line)

Который произведет '77' Если линия: char = '77';

Спасибо всем за помощь.

3 4

3 ответа:

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

>>> str = r"char x = '\077'; \nprintf(\"%c\", x);"
Префикс

r предназначен для определения необработанной строки.

Затем используйте:

>>> print re.findall(ur"'\\[0-7]{1,3}'", str)
["'\\077'"]

Демонстрация Регулярных Выражений


Код для чтения текста из stdin и применения регулярных выражений:

#!/usr/bin/python
import sys
import re

str = sys.stdin.read()
print re.findall(ur"'\\[0-7]{1,3}'", str)

Я не совсем понял, чего вы хотите.

Если вы хотите захватить восьмеричный код для символа, вы можете сделать:

s = r"char x = '\077';"
codes = re.findall(r"\\([0-7]{3})", s)
Но если вам нужны символы, вы должны добавить:
characters = [chr(int(c, 8)) for c in codes]

Если ваше намерение bytes (Python 3):

bytes_result = bytes(characters)

Или иначе строка:

str_result = ''.join(characters)
import re
x="""char x = '\077';
  printf("%c", x);"""


print oct(ord(re.findall(r"'([^']*)'",x)[0]))

Вывод: 077

Проблема, если вы хотите 077, но у вас есть \077, который python преобразует в ?, так как это значение \077 represents.So вам нужно получить целое значение ? , а затем получить значение octal.