为什么Python“分组”不适用于C中的正则表达式?

时间:2010-11-11 19:21:41

标签: python c regex

这是我的Python程序:

import re

print re.findall( "([se]{2,30})ting", "testingtested" )

它的输出是:

['es']

这是我的期望。我希望得到“es”,因为我搜索了“e”或“s”的2-30个字符,然后是“ting”。

这是我的C程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>

int main(void) {

    regex_t preg;
    regmatch_t pmatch;

    char string[] = "testingtested";

    //Compile the regular expression
    if ( regcomp( &preg, "([se]{2,30})ting", REG_EXTENDED ) ) {
        printf( "ERROR!\n" );
        return -1;
    } else {
        printf( "Compiled\n" );
    }

    //Do the search
    if ( regexec( &preg, string, 1, &pmatch, REG_NOTEOL ) ) {
        printf( "No Match\n" );
    } else {

        //Allocate memory on the stack for this
        char substring[pmatch.rm_eo - pmatch.rm_so + 1];

        //Copy the substring over
        printf( "%d %d\n", pmatch.rm_so, pmatch.rm_eo );
        strncpy( substring, &string[pmatch.rm_so], pmatch.rm_eo - pmatch.rm_so );

        //Make sure there's a null byte
        substring[pmatch.rm_eo - pmatch.rm_so] = 0;

        //Print it out
        printf( "Match\n" );
        printf( "\"%s\"\n", substring );
    }

    //Release the regular expression
    regfree( &preg );

    return EXIT_SUCCESS;
}

它的输出是:

Compiled
1 7
Match
"esting"

为什么C程序在结果中包含“ting”?我有办法排除“ting”部分吗?

2 个答案:

答案 0 :(得分:3)

pmatch是整个匹配,而不是第一个带括号的子表达式。

尝试将pmatch更改为包含2个元素的数组,然后将2代替1传递给regexec,并使用[1]元素获取子表达式匹配。

对于引用C和Python之间的差异以及不同类型的正则表达式的其他人来说,这些都是无关的。这个表达非常简单,并没有发挥作用。

答案 1 :(得分:2)

虽然正则表达式在所有地方或多或少都相同,但确实支持的功能因实现而异。

不幸的是,在设计正则表达式时,您需要分别查阅每个正则表达式库的文档。