我对正则表达式模式有疑问。我必须编写一个函数,在其中必须找到以某个单词开头并具有一定数量单词的句子。这是我到目前为止写的:
def sentences_starting_with(w,2(how many words has to contain the sentence),corpus(a text where to find the sentences)):
upper=w[0].upper()
repetition=length-1
pattern=upper+w[1:]+'(\s\w*){2}'
return re.findall(pattern,corpus)
但是问题是,当我将必须重复的部分放在方括号中时:(\ s \ w *){2}无效。它只是给我一个列表,其中我在某个随机句子句子的中间只有一个随机单词,甚至连该句子开头的单词都没有。 ypu请告诉我我在做什么错。谢谢:)
答案 0 :(得分:0)
为了使该功能正常工作,我将第一行更改为:
def sentences_starting_with(w,corpus,length=2):
我使用了以下数据和函数调用:
corpus='For example, This starts a sentence and This will do another one. this one, however\
will not, because we are looking for the word "This" with a capital letter.'
sentences_starting_with("this", corpus)
pattern=upper+w[1:]+'(\s\w*){2}'
的值为This(\s\w*){2}
,这意味着它与单词This
后跟(\s\w*){2}
(两个单词)相匹配。 \s\w*
周围的括号将捕获所捕获的两个单词中的最后一个(第二个),包括其前面的空格-表示从This
开始的第三个单词:
[' a', ' do']
我在整个模式周围加上了括号:
pattern='('+upper+w[1:]+'(\s\w*){2})'
因此,现在的模式是:(This(\s\w*){2})
,它有两组括号。第一个包含整个模式,因此它将捕获整个匹配项(单词This
和后两个单词),而第二个将捕获第三个单词(前一个空格),返回:
[('This starts a', ' a'), ('This will do', ' do')]
然后您可以遍历此列表,并获取每个元组的第一个。
为简化代码,您还可以在不想捕获的组的?:
之后添加(
,例如(?:\s\w*)
。现在的代码是:
pattern='('+upper+w[1:]+'(?:\s\w*){2})'
并返回:
['This starts a', 'This will do']
这也不是一个好习惯:
upper=w[0].upper()
在这种情况下,没有问题,因为函数upper()
是string
类中的方法。但是,如果您做了这样的事情:
len = len(w)
这可能会导致进一步的问题,因为函数len
不再可访问。现在,名称len
指向变量len
。
在此示例中:
w = 'Some random text'
name='monty python'
len = len(w)
print(len)
len2 = len(name)
输出将是:
16
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-349-9ef3e2e1cb59> in <module>
6 len = len(w)
7 print(len)
----> 8 len2 = len(name)
TypeError: 'int' object is not callable