Cython和regex.h

时间:2015-06-19 05:36:37

标签: python regex cython

我对Cython比较陌生,如果这个问题看起来非常基本,那就道歉了。

有一个可并行化的正则表达式匹配块,我想用Cython和nogil运行它。为避免使用Python对象,我的计划是导入regex.h

以下导入段编译:

cdef extern from "regex.h" nogil:
   ctypedef struct regoff_t
   ctypedef struct regex_t
   ctypedef struct regmatch_t
   int regcomp(regex_t* preg, const char* regex, int cflags)
   int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags)

def matchPatterns(str pageContent, str regex):
   cdef set matchingPatterns = set()
   return matchingPatterns

但是只要我使用regex_t或其任何功能,我就会收到错误:contentMatchPatternCython.pyx:10:16: Variable type 'regex_t' is incomplete

如果我删除空的ctypedef,则代码无法编译,因为regex_t未定义。显然,我认为/希望有一种方法可以在Cython中没有重复结构定义。

我正在使用Python 2.7.2和Cython 0.22。任何指针都会被感激地收到。

1 个答案:

答案 0 :(得分:2)

http://docs.cython.org/src/userguide/external_C_code.html

直接引用文档:

  

如果头文件声明了一个大结构而你只想使用一个   很少有成员,你只需要申报你感兴趣的成员   保留其余部分不会造成任何伤害,因为C编译器   将使用头文件中的完整定义。

     

在某些情况下,您可能不需要任何struct的成员   在哪种情况下,您可以将pass放入struct的主体中   声明,例如:

struct A {}

如果您匹配的是阅读typedef struct {} Bfunction find_student_by_firstname($firstname){ global $con; $safe_firstname = prep($firstname); $sql = "SELECT * "; $sql .= "FROM studeprofile "; $sql .= "WHERE FirstName = '{$safe_firstname}' "; $sql .= "LIMIT 1"; $student_set = mysqli_query($con, $sql); confirm_query($student_set); if($student = mysqli_fetch_assoc($student_set)){ return $student; } else { return null; } } function find_student_by_lastname($lastname){ global $con; $safe_lastname = prep($lastname); $sql = "SELECT * "; $sql .= "FROM studeprofile "; $sql .= "WHERE LastName = '{$safe_lastname}' "; $sql .= "LIMIT 1"; $student_set = mysqli_query($con, $sql); confirm_query($student_set); if($student = mysqli_fetch_assoc($student_set)){ return $student; } else { return null; } } 的C代码,则使用以下哪项内容。