Python正则表达式括号重复不起作用

时间:2019-03-11 12:46:07

标签: python regex

我对正则表达式模式有疑问。我必须编写一个函数,在其中必须找到以某个单词开头并具有一定数量单词的句子。这是我到目前为止写的:

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请告诉我我在做什么错。谢谢:)

1 个答案:

答案 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