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