我从页面中提取文本时遇到此问题。有时我会说这句话:
EatAppleGood
但我想要
Eat Apple Good
我一起获得了这三个词。我如何用大写字母拆分单词?
答案 0 :(得分:3)
如果您使用的是原子与字符串(即字符代码列表),则代码会有所不同,因为这些表示形式实际上是非常不同的数据类型。
无论如何,用
复制输入然后决定如何处理空白等......
为了简单起见,让我们看看最惯用的方式:字符列表
% words_to_lowercase(String, Word, WordsSeen, Result)
%
words_to_lowercase([C|Cs], WordR, Words, Result) :-
( code_type(C, upper(L))
-> reverse(WordR, Word),
WordsUpdated = [Word|Words],
Updated = [L]
; Updated = [C|WordR],
WordsUpdated = Words
),
words_to_lowercase(Cs, Updated, WordsUpdated, Result).
words_to_lowercase([], W, Seen, Result) :-
reverse([W|Seen], Result).
产生
?- words_to_lowercase("EatAppleGood",[],[],R), maplist(atom_codes,L,R).
R = [[], [101, 97, 116], [97, 112, 112, 108, 101], [100, 111, 111, 103]],
L = ['', eat, apple, doog].
您可以在开始时删除空单词(例如)在基本情况下应用模式匹配:
words_to_lowercase([], W, Seen, Result) :-
reverse([W|Seen], [[]|Result]).
编辑:哎呀,我忘了改掉最后一个字......
words_to_lowercase([], W, Seen, Result) :-
reverse(W, R),
reverse([R|Seen], [[]|Result]).
关于正则表达式建议的编辑,你收到Najzero的评论,你可以很好地利用最近发布的regex包。从
开始?- pack_install(regex).
然后
?- [library(regex)].
?- regex('([A-Z][a-z]+)+', [], 'EatAppleGood', L),maplist(atom_codes,A,L).
L = [[69, 97, 116], [65, 112, 112, 108, 101], [71, 111, 111, 100]],
A = ['Eat', 'Apple', 'Good'].
因为我们已准备好downcase_atom,我们可以
?- regex('([A-Z][a-z]+)+', [], 'EatAppleGood', L),maplist(atom_codes,A,L),maplist(downcase_atom,A,D).
L = [[69, 97, 116], [65, 112, 112, 108, 101], [71, 111, 111, 100]],
A = ['Eat', 'Apple', 'Good'],
D = [eat, apple, good].