On 10/30/2016 01:50 PM, Alfred Newman wrote:
Hello,

I'm migrating some Python code to D, but I stuck at a dead end...

Sorry to provide some .py lines over here, but I got some doubts about
the best (fastest) way to do that in D.

Executing the function parsertoken("_My   input.string", " _,.", 2) will
result "input".
Parsercount("Dlang=-rocks!", " =-") will result 2,

def parsertoken(istring, idelimiters, iposition):
"""
Return a specific token of a given input string,
considering its position and the provided delimiters

:param istring: raw input string
:param idelimiteres: delimiters to split the tokens
:param iposition: position of the token
:return: token
"""
    vlist=''.join([s if s not in idelimiters else ' ' for s in
istring]).split()
    return vlist[vposition]

def parsercount(istring, idelimiters):
"""
Return the number of tokens at the input string
considering the delimiters provided

:param istring: raw input string
:param idelimiteres: delimiters to split the tokens
:return: a list with all the tokens found
"""
    vlist=''.join([s if s not in vdelimiters else ' ' for s in
istring]).split()
    return len(vlist)-1


Thanks in advance

Here is something along the lines of what others have suggested:

auto parse(R, S)(R range, S separators) {
    import std.algorithm : splitter, filter, canFind;
    import std.range : empty;

return range.splitter!(c => separators.canFind(c)).filter!(token => !token.empty);
}

unittest {
    import std.algorithm : equal;

assert(parse("_My input.string", " _,.").equal([ "My", "input", "string" ]));
}

auto parsertoken(R, S)(R range, S separator, size_t position) {
    import std.range : drop;

    return parse(range, separator).drop(position).front;
}

unittest {
    import std.algorithm : equal;

    assert(parsertoken("_My   input.string", " _,.", 1).equal("input"));
}

auto parsercount(R, S)(R range, S separator) {
    import std.algorithm : count;

    return parse(range, separator).count;
}

unittest {
    assert(parsercount("Dlang=-rocks!", " =-") == 2);
}

void main() {
}

Ali

Reply via email to