2010-10-26 40 views
1

这里的所有组是我到目前为止蟒蛇正则表达式查找单词

text = "Hello world. It is a nice day today. Don't you think so?" 
re.findall('\w{3,}\s{1,}\w{3,}',text) 
#['Hello world', 'nice day', 'you think'] 

所需的输出将是[“世界,你好”,“美好的一天”,“今天一天”,“今天不','你','你认为']

这可以用一个简单的正则表达式模式来完成吗?

+0

你想达到什么目的? – helpermethod 2010-10-26 22:18:16

+0

我想分组所有2(在这种情况下)字符是3个或更多的字符,如上面的例子所需的输出 – tomfmason 2010-10-26 22:32:56

回答

1
import itertools as it 
import re 

three_pat=re.compile(r'\w{3}') 
text = "Hello world. It is a nice day today. Don't you think so?" 
for key,group in it.groupby(text.split(),lambda x: bool(three_pat.match(x))): 
    if key: 
     group=list(group)  
     for i in range(0,len(group)-1): 
      print(' '.join(group[i:i+2])) 

# Hello world. 
# nice day 
# day today. 
# today. Don't 
# Don't you 
# you think 

这我不清楚你想与所有的标点做了什么。一方面,它看起来像你想要删除时段,但单引号要保留。实施删除时间段会很容易,但在此之前,您是否会澄清您想要发生的所有标点符号?

-1

这是一个很好的例子,当不是使用正则表达式进行解析。

+3

这是一个很好的例子,当不发布答案。 – SilentGhost 2010-10-26 22:17:15

+0

好吧,有一个简单的选择? – tomfmason 2010-10-26 22:30:33

1
map(lambda x: x[0] + x[1], re.findall('(\w{3,}(?=(\s{1,}\w{3,})))',text)) 

可能是你可以重写拉姆达较短(如只是“+”) 而BTW“不是\ W的一部分或用\ s

+0

好吧,超级方式:map(“”。join,re.findall('(\ w {3,}(?=(\ s {1,} \ w {3,})))',text )) – Lachezar 2010-10-26 22:46:42

+0

不错,但你的例子向我确认,正则表达式将使你的Python看起来像Perl。 – pyfunc 2010-10-26 22:51:26

+0

是的,所有使用regexp的“非常像”Perl,因为Perl是现今正则表达式的基础--PCRE(Perl Compatible Reg Exp) - http://en.wikipedia.org/wiki/Regular_expression – Lachezar 2010-10-26 22:57:42

1

像这样的事情与列表边界的附加检查应这样做:

>>> text = "Hello world. It is a nice day today. Don't you think so?" 
>>> k = text.split() 
>>> k 
['Hello', 'world.', 'It', 'is', 'a', 'nice', 'day', 'today.', "Don't", 'you', 'think', 'so?'] 
>>> z = [x for x in k if len(x) > 2] 
>>> z 
['Hello', 'world.', 'nice', 'day', 'today.', "Don't", 'you', 'think', 'so?'] 

>>> [z[n]+ " " + z[n+1] for n in range(0, len(z)-1, 2)] 
['Hello world.', 'nice day', "today. Don't", 'you think'] 
>>> 
+0

有时,正则表达式比他们值得的更麻烦。 +1 – jkerian 2010-10-26 22:54:01

1

有两个问题你的方法:

  1. 无论\ W或\ SM atches标点符号。
  2. 当您使用findall匹配正则表达式的字符串时,该字符串的该部分将被消耗。在上一场比赛结束后立即开始搜寻下一场比赛。正因为如此,一个单词不能包含在两个单独的比赛中。

要解决第一个问题,您需要确定一个词的含义。正则表达式不适合这种解析。您可能需要查看自然语言解析库。

但是,假设您可以想出适合您需求的正则表达式,要解决第二个问题,您可以使用lookahead assertion来检查第二个单词。这将不会返回整个匹配,但您至少可以使用此方法在每个单词对中找到第一个单词。

re.findall('\w{3,}(?=\s{1,}\w{3,})',text) 
        ^^^   ^
        lookahead assertion