2013-03-22 77 views
5

我想查找一个短语,匹配它后面的几个单词,但如果我找到另一个特定短语,请尽早停止。正则表达式:匹配一个单词或最大单词数

例如,我想匹配“去”的三个词,但如果遇到“尝试”,停止匹配过程。因此,例如“去月神公园”将导致“月神公园”; “前往秘鲁首都”将以“首都之城”和“去月球尝试一些芝士蛋糕”为结果带来“月球”。

它可以用一个简单的正则表达式完成吗(最好在Python中)?我尝试过所有我能想到的组合,但失败惨惨:)。

+2

请告诉我们您的最成功的尝试。 – NPE 2013-03-22 07:25:33

+0

只为了这里的乐趣是一个非正则表达式的解决方案:'''.join(text.split('去'')[1] .split('尝试')[0] .split()[:3]) ' – jamylak 2013-03-22 08:00:33

回答

5

这一个匹配3({1,3})以下going to the,只要他们不跟去尝试的话((?!to try)):

import re 
infile = open("input", "r") 
for line in infile: 
    m = re.match("going to the ((?:\w+\s*(?!to try)){1,3})", line) 
    if m: 
     print m.group(1).rstrip() 

输出

luna park 
capital city of 
moon 
+0

更改为 – jamylak 2013-03-22 07:48:10

+0

为什么它会与“去美丽的大月亮尝试芝士蛋糕”并返回“美丽的大月亮”?我期待“月亮”不匹配,因为它后面是“尝试”... ... – EOL 2013-03-22 07:56:40

+2

@EOL考虑“去月球试试...”:''月亮''后面跟着'尝试'并且失败向前看。引擎回退一个空间然后进行比赛。现在下一个字符是空格,并且不匹配'\ w',所以你不会得到第二个单词。 – 2013-03-22 08:06:04

-2

我认为你正在寻找一种方法来从句子中提取专有名词。你应该看看NLTK的正确方法。正则表达式只能用于有限的上下文无关语法。另一方面,你似乎要求分析人类语言的能力,这对于计算机来说是不平凡的。

+1

这不是问题 – jamylak 2013-03-22 07:32:11

+2

如果有什么,可能更适合作为评论。 – Dukeling 2013-03-22 07:33:19

相关问题