0

我正在尝试搜索一个字符串,我知道它始终是一个句子,以查找逗号之前的三个单词和逗号之后的三个单词。正则表达式是做到这一点的正确方法吗?您如何解释有时您会出现在句子的开头和结尾并且不会有 3 个单词的事实?

感谢您的帮助,正在尝试学习正则表达式。

4

2 回答 2

0

嗯,那个有点长,但我想它有效:

>>> import re
>>> string = "The brown fox jumped over the red barn, and found the chickens."
>>> res = re.findall(r'(\b[a-z]+\b)?[^a-z]*(\b[a-z]+\b)?[^a-z]*(\b[a-z]+\b)?[^a-z]*,\s*(\b[a-z]+\b)?[^a-z]*(\b[a-z]+\b)?[^a-z]*(\b[a-z]+\b)?', string, re.IGNORECASE)
>>> res
[('the', 'red', 'barn', 'and', 'found', 'the')]

这也将忽略数字,例如:

string = "The brown fox jumped over the red barn, and found 10 chickens."

给予:

[('the', 'red', 'barn', 'and', 'found', 'chickens')]

对于这样的事情:

string = "The brown fox jumped over the red barn, and fled."

它给:

[('the', 'red', 'barn', 'and', 'fled')]

逗号前的单词也是如此。

\b指的是单词边界,并且仅匹配单词(字母或数字)的末尾。

[a-z]+指一个字符类,即从a到的所有字母z。末尾的+表示这个字符类重复了不止一次,从而完成了一个完整单词的匹配。

(\b[a-z]+\b)是一个捕获组(注意括号)并将存储在结果中。在末尾添加问号表示可能出现(即如果存在则匹配,如果不存在则不匹配,因此如果逗号前少于 3 个单词如何获得结果) .

[^a-z]*是一个否定类,请注意左方括号后面的插入符号。它将匹配任何字符,而不是a通过z. 星号*表示出现 0 次或多次。

,是文字逗号。

\s是空格、制表符、换行符。它后面的星号仍然表示出现 0 次或多次。

re.IGNORECASE,正如它所暗示的那样,将使匹配不区分大小写。

于 2013-07-08T18:14:12.763 回答
0

对于你的例子,

sen= "The brown fox jumped over the red barn,and found the chickens"
result_left=sen.split(',')[0].split()[-3:]

#result_left ['the', 'red', 'barn']

#for the right words
result_right=sen.split(',')[1].split()[:3]
于 2013-07-08T18:03:08.387 回答