【问题标题】:Regex and Octal Characters正则表达式和八进制字符
【发布时间】:2016-04-17 10:43:56
【问题描述】:

我正在尝试编写一个捕获八进制字符的正则表达式。

例如,如果我与正则表达式比较的行是:

char x = '\077';

我希望我的正则表达式捕获'\077'

我试图通过 re 模块和形式的正则表达式来做到这一点:

"'\\[0-7]{1-3}'"

但这并不能捕获八进制字符。 Python中如何使用正则表达式识别八进制字符?

编辑:

作为我的意思的一个例子,考虑一下 C 代码:

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

我想从第一行捕获'\077'

编辑:

在测试了此线程中的一些建议后,我有一个可行的案例。我意识到在将八进制正则表达式添加到更大的正则表达式之后,我需要为原始输入添加前缀 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)

如果行是:char = '\077';,则会产生 '\077'

感谢大家的帮助。

【问题讨论】:

  • 八进制是一个数字,以 8 为底。它不是一个字符。
  • 试试this code
  • @stribizhev..范围是[0-9] ..这是一个十进制范围而不是八进制,不是吗?
  • 我认为r"'\\0[0-7]{2}'" 是您所需要的。见updated code
  • 我认为这应该是转换为原始字符串的技巧:s = s.replace("\\", "\\\\") ?

标签: python regex string octal


【解决方案1】:

您需要将输入定义为原始字符串

>>> str = r"char x = '\077'; \nprintf(\"%c\", x);"

前缀r 用于定义原始字符串。

然后使用:

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

RegEx Demo


从标准输入读取文本并应用正则表达式的代码:

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

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

【讨论】:

  • [0-9][0-7] ?
【解决方案2】:

我不明白你到底想要什么。

如果你想捕获字符的八进制代码,你可以这样做:

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)

【讨论】:

    【解决方案3】:
    import re
    x="""char x = '\077';
      printf("%c", x);"""
    
    
    print oct(ord(re.findall(r"'([^']*)'",x)[0]))
    

    输出:077

    如果你想要077 但你有\077 的问题,python 将转换为? 因为这是\077 代表的值。所以你需要得到? 的整数值然后得到octal 值。

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      相关资源
      最近更新 更多