这里的所有组是我到目前为止蟒蛇正则表达式查找单词
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']
所需的输出将是[“世界,你好”,“美好的一天”,“今天一天”,“今天不','你','你认为']
这可以用一个简单的正则表达式模式来完成吗?
这里的所有组是我到目前为止蟒蛇正则表达式查找单词
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']
所需的输出将是[“世界,你好”,“美好的一天”,“今天一天”,“今天不','你','你认为']
这可以用一个简单的正则表达式模式来完成吗?
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
这我不清楚你想与所有的标点做了什么。一方面,它看起来像你想要删除时段,但单引号要保留。实施删除时间段会很容易,但在此之前,您是否会澄清您想要发生的所有标点符号?
这是一个很好的例子,当不是使用正则表达式进行解析。
这是一个很好的例子,当不发布答案。 – SilentGhost 2010-10-26 22:17:15
好吧,有一个简单的选择? – tomfmason 2010-10-26 22:30:33
map(lambda x: x[0] + x[1], re.findall('(\w{3,}(?=(\s{1,}\w{3,})))',text))
可能是你可以重写拉姆达较短(如只是“+”) 而BTW“不是\ W的一部分或用\ s
好吧,超级方式:map(“”。join,re.findall('(\ w {3,}(?=(\ s {1,} \ w {3,})))',text )) – Lachezar 2010-10-26 22:46:42
不错,但你的例子向我确认,正则表达式将使你的Python看起来像Perl。 – pyfunc 2010-10-26 22:51:26
是的,所有使用regexp的“非常像”Perl,因为Perl是现今正则表达式的基础--PCRE(Perl Compatible Reg Exp) - http://en.wikipedia.org/wiki/Regular_expression – Lachezar 2010-10-26 22:57:42
像这样的事情与列表边界的附加检查应这样做:
>>> 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']
>>>
有时,正则表达式比他们值得的更麻烦。 +1 – jkerian 2010-10-26 22:54:01
有两个问题你的方法:
要解决第一个问题,您需要确定一个词的含义。正则表达式不适合这种解析。您可能需要查看自然语言解析库。
但是,假设您可以想出适合您需求的正则表达式,要解决第二个问题,您可以使用lookahead assertion来检查第二个单词。这将不会返回整个匹配,但您至少可以使用此方法在每个单词对中找到第一个单词。
re.findall('\w{3,}(?=\s{1,}\w{3,})',text)
^^^ ^
lookahead assertion
你想达到什么目的? – helpermethod 2010-10-26 22:18:16
我想分组所有2(在这种情况下)字符是3个或更多的字符,如上面的例子所需的输出 – tomfmason 2010-10-26 22:32:56