我正在学习正则表达式并试图将文本拆分成句子。
这是我的文字
"先生。史密斯以150万美元的价格买下了cheapsite.com,即他为此付出了很多。他介意吗? Adam Jones Jr.认为他没有。在任何情况下,这都不是真的......好吧,概率为.9,它不是。"
我的正则表达式和代码
result = re.match(r"(.*\.{1}\s{1})[A-Z].*",line)
result.group(1)给了我
"先生。史密斯以150万美元的价格买下了cheapsite.com,即他为此付出了很多。他介意吗? Adam Jones Jr.认为他没有。无论如何,这不是真的......"
我希望它能给我一个句子,直到第一次出现"。#34;。 我知道这是一场贪婪的比赛,但无法弄清楚如何实现这一目标以及寻求帮助。
注意:我发现许多正则表达式在线将文本分成句子,但我想自己做。感谢!!!
答案 0 :(得分:1)
使用以下RegEx:
.*?\.(?= [A-Z]|$)
.*?
会选择可选数据,但它是懒惰的(它会选择第一个.
)
(?=)
是肯定前瞻。它将检查数据是否存在,但不会捕获它,因此您不会得到My first sentence. M
,就像下面的RegEx一样。它将检查空格后跟大写字母([A-Z]
)或(|
)字符串结尾($
)
Mr.
和Mrs.
)要阻止Mr.
弄乱RegEx,您可以向RegEx添加负面反对:
.*?(?<!Mr|Mrs)\.(?= [A-Z]|$)
Negative Lookbehind将向后看以检查点之前是否有Mr
或Mrs
。如果有,则匹配将失败(这不会是句子的结尾)。
您可以使用.*?\. [A-Z]
,但这不会捕获字符串中的最后一句话。它还将匹配句子后面的空格和字母,即My first sentence. M
你的RegEx的主要问题是第一个.*
不是懒惰的,应该是.*?
,但捕获组也有点奇怪。