classes:
Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
None>>import re
r = re.compile('[:alnum:]+')
print r.match('123')
So I thought I'd try out pcre through ctypes, to recreate pcredemo.c
in python. The c code is at:
http://vcs.pcre.org/viewvc/code/trun....c?view=markup
Partial Python code is below
I'm stuck, from what I can tell a c array, such as:
int ovector[OVECCOUNT];
translates to
ovector = ctypes.c_int * OVECOUNT
but when I pass ovector to a function I get the traceback
$ python pcredemo.py [a-z] fred
Traceback (most recent call last):
File "pcredemo.py", line 65, in <module>
compiled_re, None, subject, len(subject), 0, 0, ovector, OVECOUNT
ctypes.ArgumentError: argument 7: <type 'exceptions.TypeError'>: Don't
know how to convert parameter 7
What is the correct way to construct and pass ovector?
With thanks, Alex
# PCRE through ctypes demonstration program
import ctypes
import getopt
import sys
import pcre_const
OVECOUNT = 30 # Should be a multiple of 3
pcre = ctypes.cdll.LoadLibrary('libpcre.so')
compiled_re = None
error = ctypes.c_char_p()
pattern = ''
subject = ''
name_table = ctypes.c_ubyte()
erroffset = ctypes.c_int()
find_all = 0
namecount = 0
name_entry_size = 0
ovector = ctypes.c_int * OVECOUNT
options = 0
# First, sort out the command line. There is only one possible option
at
# the moment, "-g" to request repeated matching to find all
occurrences,
# like Perl's /g option. We set the variable find_all to a non-zero
value
# if the -g option is present. Apart from that, there must be exactly
two
# arguments.
opts, args = getopt.getopt(sys.argv[1:], 'g')
for o, v in opts:
if o == '-g': find_all = 1
# After the options, we require exactly two arguments, which are the
# pattern, and the subject string.
if len(args) != 2:
print 'Two arguments required: a regex and a subject string'
sys.exit(1)
pattern = args[0]
subject = args[1]
subject_length = len(subject)
# Now we are going to compile the regular expression pattern, and
handle
# and errors that are detected.
compiled_re = pcre.pcre_compile(
pattern, options, ctypes.byref(error),
ctypes.byref(erroffset),
None
)