Python正则表达式查找所有单词组
这是我目前的进展
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']
我想要的结果是这样的:['Hello world', 'nice day', 'day today', 'today Don't', 'Don't you', 'you think']
这个可以用简单的正则表达式来实现吗?
相关问题:
4 个回答
1
你的方法有两个问题:
- \w 和 \s 都无法匹配标点符号。
- 当你用正则表达式的 findall 方法去匹配一个字符串时,匹配到的部分会被“消耗掉”。这意味着下一个匹配会从上一个匹配的结束位置开始。因此,一个单词不能被分成两个不同的匹配。
要解决第一个问题,你需要先明确什么是“单词”。正则表达式在处理这种解析时并不是特别好。你可能需要看看一些自然语言解析的库。
假设你能找到一个适合你需求的正则表达式,解决第二个问题的方法是使用前瞻断言来检查第二个单词。虽然这样做不能返回你想要的整个匹配结果,但至少你可以用这种方法找到每对单词中的第一个单词。
re.findall('\w{3,}(?=\s{1,}\w{3,})',text)
^^^ ^
lookahead assertion
1
map(lambda x: x[0] + x[1], re.findall('(\w{3,}(?=(\s{1,}\w{3,})))',text))
你可以把这个lambda表达式改得更简短一点,比如直接用'+'就可以了。顺便说一下,'并不是\w或\s的一部分。
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
我不太明白你想对所有标点符号做什么。一方面,看起来你想去掉句号,但又想保留单引号。去掉句号这件事很简单,但在我动手之前,你能不能再说明一下你希望所有标点符号怎么处理?