2013-11-11 4 views
0

Когда я начал писать одну функцию, у меня появилась ошибка синтаксиса. Я попробовал выполнить линию в REPL - и это сработало. Но я хочу сделать это на IDE. Может кто-нибудь мне помочь?Ошибка синтаксиса в Python regexp

Мой код:

def sentence_splitter(file_name): 
    with open(file_name) as f: 
     input_str = f.read() 
     period_indexes = get_periods(input_str) 
     for el in period_indexes: 
      sub_str = input_str[el - 14:el + 14] 
      if not re.search(r'\.\s+[A-Za-z]{1,3}\w+', sub_str) and # Error here 
      re.search(r'\.\d+', sub_str) and 
      re.search(r'\.\s+[a-z]+', sub_str) and 
      re.search(r'([A-Za-z\.]+\.\w+){1,50}', sub_str) and 
      re.search(r'\w+\.[\.,]+', s): 
       pass 
+3

Вам нужно двоеточие ':' 'после if' заявления. Это отсутствует или просто ошибка при копировании кода? – mdml

+0

Это не конец оператора if. У меня есть шесть строк re.search() в моем состоянии – Absolut

+0

@ Absolut Ну, как вы знаете, что это не в одном из них? –

ответ

3

Вы должны круглые скобки вокруг вашей, если заявление:

def sentence_splitter(file_name): 
    with open(file_name) as f: 
     input_str = f.read() 
     period_indexes = get_periods(input_str) 
     for el in period_indexes: 
      sub_str = input_str[el - 14:el + 14] 
      if not (re.search(r'\.\s+[A-Za-z]{1,3}\w+', sub_str) and # Error here 
      re.search(r'\.\d+', sub_str) and 
      re.search(r'\.\s+[a-z]+', sub_str) and 
      re.search(r'([A-Za-z\.]+\.\w+){1,50}', sub_str) and 
      re.search(r'\w+\.[\.,]+', s)): 
       pass 

Технически обратный слеш будет работать, но Скобки больше вещий см PEP8: http://www.python.org/dev/peps/pep-0008/#maximum-line-length

+0

Вопрос, где первые круглые скобки должны быть: до или после 'not' ... –

+0

Это зависит, хотите ли вы, чтобы' not' применимо ко всему оператору или только к одному условию. 'not (1 == 1 и 1 == 2)' истинно, но '(не 1 == 1 и 1 == 2)' false. – Chris

+0

Не говорите мне! ;-) Возможно, вы хотите добавить это объяснение к своему ответу, в конце концов, поведение по умолчанию, если все они были в одной строке, будет заключаться в том, что 'not' применяется только к первому члену. I.e., вы исправили ошибку (+1), но также изменили (зафиксировали?) Условие. –

1

В вашей last regexp:

re.search(r'\w+\.[\.,]+', s) 

Выполняется поиск по s, который не определен. Все остальные регулярные выражения выполняют поиск по substr, что, вероятно, то, что вы хотите. Это поднимет NameError, хотя и не SyntaxError.

Кроме того, вы, вероятно, захотите реорганизовать свой код, чтобы его было легче читать, как объяснено в моем комментарии к вашему вопросу.

2

Ваши условные охватывает несколько линий. Вам нужно добавить символ продолжения строки \.

if not re.search(r'\.\s+[A-Za-z]{1,3}\w+', sub_str) and \ 
      re.search(r'\.\d+', sub_str) and \ 
      re.search(r'\.\s+[a-z]+', sub_str) and \ 
      re.search(r'([A-Za-z\.]+\.\w+){1,50}', sub_str) and \ 
      re.search(r'\w+\.[\.,]+', s): 

Дополнительная информация об этом доступна в PEP8 и этот answer.

Одно примечание специфичные для вашего кода:

re.search(r'\w+\.[\.,]+', s) 
          ^---- This variable is not assigned 
           (likely should be sub_str) 
Смежные вопросы