我正在尝试搜索一个字符串,我知道它始终是一个句子,以查找逗号之前的三个单词和逗号之后的三个单词。正则表达式是做到这一点的正确方法吗?您如何解释有时您会出现在句子的开头和结尾并且不会有 3 个单词的事实?
感谢您的帮助,正在尝试学习正则表达式。
嗯,那个有点长,但我想它有效:
>>> 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
,正如它所暗示的那样,将使匹配不区分大小写。
对于你的例子,
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]