Повторение скобок регулярного выражения Python не работает - PullRequest
0 голосов
/ 11 марта 2019

У меня вопрос по шаблону регулярных выражений. Я должен написать функцию, где я должен найти предложения, которые начинаются с определенного слова и имеют определенное количество слов. Это то, что я написал до сих пор:

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} это не работает. Это просто дает мне список, где у меня есть только одно случайное слово в середине некоторого случайного предложения, и даже нет слова, с которого должно начинаться предложение. Не могли бы вы сказать мне, что я делаю неправильно. Спасибо:)

1 Ответ

0 голосов
/ 11 марта 2019

Чтобы функция работала, я изменил первую строку следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...