gpt4 book ai didi

regex - 查找小写化学式的所有可能排列

转载 作者:行者123 更新时间:2023-12-01 09:09:25 24 4
gpt4 key购买 nike

我正在尝试解决小写化学式中的歧义。由于一些元素名称是其他元素名称的子字符串,并且它们全部一起运行,因此同一模式可以有多个全局匹配项。

考虑针对字符串 hgas 的正则表达式 /^((h)|(s)|(hg)|(ga)|(as))+$/ .有两种可能的匹配。 hg, ash, s, ga(与输入相比乱序,但不是问题)。显然,所有可能符号的正则表达式会更长,但这个例子是为了简单起见。

Regex 强大的先行和后行功能使其能够最终确定是否即使是很长的字符串也与此模式匹配,或者是否没有可能的字母排列。它会努力尝试所有可能的匹配排列,例如,如果它用剩余的 g 命中字符串的末尾,则返回并重试不同的组合。

我正在寻找一个正则表达式,或者一种具有某种扩展的语言,它增加了在找到匹配项后继续寻找匹配项的能力,在这种情况下,找到 h, s, ga 以及 hg, as

针对此问题重建正则表达式的复杂先行和后行功能似乎不是一个合理的解决方案,尤其是考虑到最终的正则表达式还在每个符号后包含一个\d*。

我想过颠倒正则表达式的顺序,/^((as)|(ga)|(hg)|(s)|(h))+$/,找到额外的映射,但这最多只能找到一个额外的匹配项,而且我没有正则表达式的理论背景,不知道尝试是否合理。

我已经使用我现有的正则表达式创建了一个示例页面,该正则表达式为给定的小写字符串找到 1 或 0 个匹配项并返回它正确大写(并且乱序)。它在匹配中使用前 100 个化学符号。

http://www.ptable.com/Script/lowercase_formula.php?formula=hgas

tl;dr:我有一个正则表达式来匹配字符串中 0 或 1 个可能的化学式排列。如何找到超过 1 个匹配项?

最佳答案

我很清楚这个答案可能是题外话(就像在方法中一样),但我认为它很有趣,并且它解决了 OP 的问题。

如果您不介意学习一门新语言 (Prolog),那么它可能会帮助您生成所有可能的组合:

name(X) :- member(X, ['h', 's', 'hg', 'ga', 'as']).

parse_([], []).
parse_(InList, [HeadAtom | OutTail]) :-
atom_chars(InAtom, InList),
name(HeadAtom),
atom_concat(HeadAtom, TailAtom, InAtom),
atom_chars(TailAtom, TailList),
parse_(TailList, OutTail).

parse(In, Out) :- atom_chars(In, List), parse_(List, Out).

样本运行:

?- parse('hgas', Out).
Out = [h, ga, s] ;
Out = [hg, as] ;
false.

改进后的版本,包括对数字的处理,稍微长一点:

isName(X) :- member(X, ['h', 's', 'hg', 'ga', 'as', 'o', 'c']).

% Collect all numbers, since it will not be part of element name.
collect([],[],[]).
collect([H|T], [], [H|T]) :-
\+ char_type(H, digit), !.
collect([H|T], [H|OT], L) :-
char_type(H, digit), !, collect(T, OT, L).

parse_([], []).
parse_(InputChars, [Token | RestTokens]) :-
atom_chars(InputAtom, InputChars),
isName(Token),
atom_concat(Token, TailAtom, InputAtom),
atom_chars(TailAtom, TailChars),
parse_(TailChars, RestTokens).

parse_(InputChars, [Token | RestTokens]) :-
InputChars = [H|_], char_type(H, digit),
collect(InputChars, NumberChars, TailChars),
atom_chars(Token, NumberChars),
parse_(TailChars, RestTokens).

parse(In, Out) :- atom_chars(In, List), parse_(List, Out).

样本运行:

?- parse('hgassc20h245o', X).
X = [h, ga, s, s, c, '20', h, '245', o] ;
X = [hg, as, s, c, '20', h, '245', o] ;
false.

?- parse('h2so4', X).
X = [h, '2', s, o, '4'] ;
false.

?- parse('hgas', X).
X = [h, ga, s] ;
X = [hg, as] ;
false.

关于regex - 查找小写化学式的所有可能排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12501507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com