给出以下短语
女士。玛丽在去美国旅行时认识了她的丈夫戴夫先生 真酷你知道Dave在微软工作吗?好吧,他做到了。他甚至是Internet Explorer开发者的一部分。
将“伪代码”分成句子的最佳方式是什么? Python或任何其他类似的语言也很好,因为它的伪代码相似。
我认为将" a-zA-Z."
(注意空格),".a-zA-Z"
和".a-zA-Z."
的每一次出现都替换为等效的,当然没有点,所以例如
" a."
" b."
" c."
" d."
" e."
" f."
...
和
".a."
".b."
".c."
".d."
".e."
".f."
...
和
" ab."
" ac."
" ad."
...
" ba."
" bc."
" bd."
...
该短语应该很好地转换为以下
玛丽女士在去美国旅行时认识了她的丈夫戴夫先生 真酷你知道Dave在微软工作吗?好吧,他做到了。他甚至是Internet Explorer开发者的一部分。
......或者我在某处错了,我的逻辑有缺陷?
对于未来的 您的问题 评论,我需要知道将示例文本拆分为正确句子的最佳方法是什么,避免与首字母缩略词发生冲突。
这可以用伪代码,Python或类似伪代码的其他语言来解释。我希望它与语言无关,所以任何人都可以实现它,无论他们使用何种语言。
答案 0 :(得分:0)
示例中的所有首字母缩略词都是模式Uppercase .
或Uppercase lowercase .
;没有其他 - 常规 - 出现的句号符合这种特殊模式。
因此,可以使用简单的RegEx来删除句号。之后剩下的内容可以分为常规标点符号.!?
。在Javascript中:
str2 = str.replace(/([A-Z][a-z]?)\./g, '$1');
或使用 理解最常见字符类的GREP风格:
str2 = str.replace(/(\u\l?)\./g, '$1');
这直接导致输出如图所示。
使用RegEx非常简单(并且可以轻松扩展!),但同样的模式也可以在其他语言中进行测试。在C中,您可以将输入复制到输出,并仅在看到.
字符时进行测试:
int main (void)
{
char input[] = "Ms. Mary got to know her husband Mr. Dave in her trip to "
"U.S.A. and it was cool. Did you know Dave worked for Microsoft? Well "
"he did. He was even part of Internet Explorer devs.";
char output[256], *readptr, *writeptr;
printf ("in: %s\n", input);
readptr = input;
writeptr = output;
while (*readptr)
{
if (*readptr == '.')
{
if ((readptr > input && isupper(readptr[-1])) ||
(readptr > input+1 && isupper(readptr[-2]) && islower(readptr[-1])))
{
readptr++;
continue;
}
}
*writeptr = *readptr;
readptr++;
writeptr++;
}
*writeptr = 0;
printf ("out: %s\n", output);
return 0;
}
这些解决方案从源文本中删除句号。如果你想保留它们,可以用占位符替换它们(例如,源文本中通常不会出现的字符),或者反过来:当分割句子时,测试到看看句号是否是一个有效的断点。
事后补充: 在原始样本句子上工作......但它不在评论中的那个:
I made a trip to the U.S.A. It was cool.I liked it very much.
获取输出
I made a trip to the USA It was cool.I liked it very much.
这需要检查更多可能的情况:
Ms.
和Mr.
:\u\l\.
(\u\.)+ (?=\l)
,其中需要删除句号; (\u\.)+ (?=\u)
,其中最后一个句号应该保留。