用Python和Regex在字符串中查找C关键字

2024-09-28 21:56:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在字符串中找到并打印C关键字的开始和结束索引

code = 'int main( void )\n{\nreturn 0;\n}'

以下是我目前所掌握的情况:

^{pr2}$

然而,只发现了“void”。为什么?在


Tags: 字符串main情况code关键字intvoidpr2
3条回答

首先,Python不使用正斜杠(/)来表示正则表达式模式的开始和结束。按照惯例,使用原始字符串。原始字符串是避免字符串中特殊字符编码的一种方法。最常见的例子是换行符('\n')。通常这两个字符将被转换成一个特殊的换行符,但是如果我们想要一个literal正斜杠后跟一个literaln,我们使用一个原始字符串,比如r'\n'。或者,我们可以转义反斜杠字符并将其写为'\\n',但是对于具有更多特殊字符的较长字符串,我们确实希望避免在任何地方都使用反斜杠。正如您可能注意到的,原始字符串是编写正则表达式的一种非常方便的方法。在

您忘记将模式设置为原始字符串,因此\b被解释为特殊的转义字符(在本例中,无论出于何种原因,它都会转换为ASCII字符#8),而不是字边界。通过在字符串前面加上r可以使任何字符串文本成为原始字符串:

>>> re.findall('\bint|void|return\b', 'int main( void )\n{\nreturn 0;\n}')
['void']
>>> re.findall(r'\bint|void|return\b', 'int main( void )\n{\nreturn 0;\n}')
['int', 'void', 'return']

下面是一个例子:

src='''\
int main( void )
   {
      return 0;
   }
'''

import re

for key, span in ((m.group(1), m.span(1)) for m in re.finditer(r'\b(int|main|void|return)\b', src)):
    print key, span

印刷品:

^{pr2}$

但我认为使用一组关键字来验证找到的单词比将所有单词都放在一个模式中要好。在

考虑:

keywords={'int', 'main', 'void', 'return'}

for key, span in ((m.group(1), m.span(1)) for m in re.finditer(r'\b(\w+)\b', src) 
                                                          if m.group(1) in keywords):
    print key, span

输出相同,但更容易添加单词。在

pattern = '/\bint|void|return\b/' # wrong

1。Python不在/中包含模式:

^{pr2}$

2。您确实希望将此字符串设为原始字符串,否则\b将被解释为控制字符:

pattern = r'\bint|void|return\b' # still wrong

3。您需要将您的或组括在括号中:

pattern = r'\b(int|void|return)\b' # yay

然后:

re.compile(pattern).findall(code)
# ['int', 'void', 'return']

在您最初的模式中,整个事件被分为三个独立的或部分:
/\bintvoid、和{},因此自然只能找到{}。在

相关问题 更多 >