Parse a String given some delimiters
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Oct 30 16:47:54 PDT 2016
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
More information about the Digitalmars-d-learn
mailing list