2015-04-20 5 views
0

Я пытаюсь заменить захватить \n\n в ниже содержание:Python Regex Путаница с =

Однако, когда я пытаюсь:

re.search('=============== K # 1 ===============(.*)=====================', 
    '=============== K # 1 ===============\n\n==================================================') 

я вернусь None.

Если я:

re.search('=============== K # 1 ===============(.*)', 
    '=============== K # 1 ===============\n\n==================================================') 

я получу матч.

Почему дополнительные ===... препятствуют мне соответствовать?

ответ

1

Если вы пытаетесь, чтобы соответствовать новой строки, попробуйте

re.search('=============== K # 1 ===============(\n*)=====================', 
'=============== K # 1 ===============\n\n==================================================') 

Как * жаден, если вы используете ., он будет соответствовать как многие из = с, как он может после \n с как ну как только \n с, если вы используете re.DOTALL, чтобы он соответствовал \n. Поскольку вы, по-видимому, только хотите сопоставить \ n \ n, это не то, что вы хотите.

Обратите внимание, что вы можете сделать это более компактным, указав количество = с вы хотите, чтобы соответствовать:

re.search('={15} K # 1 ={15}(\n*)={21}', 
'=============== K # 1 ===============\n\n==================================================') 

Чтобы проиллюстрировать эту проблему с помощью .:

In [7]: s = '=============== K # 1 ===============\n\n==================================================' 

In [8]: re.search('={15} K # 1 ={15}(.*)={21}', s, re.DOTALL).groups() 
Out[8]: ('\n\n=============================',) 

In [9]: re.search('={15} K # 1 ={15}(\n*)={21}', s).groups() 
Out[9]: ('\n\n',) 

В качестве альтернативы, вы можете используйте [^=] для соответствия любым не-'=' или \s для соответствия любым пробелам.

3

По умолчанию . не соответствует символам новой строки. См. here:

(Dot.) В режиме по умолчанию это соответствует любому символу, кроме новой строки. Если флаг DOTALL указан, это соответствует любому символу, включая новую строку.

Таким образом, чтобы исправить это, добавьте re.DOTALL флаг:

re.search('=============== K # 1 ===============(.*)=====================', 
      '=============== K # 1 ===============\n\n==================================================', 
      re.DOTALL) 
+0

В то время как это будет работать, матч он возвращает будет включать в себя некоторое количество '=' ы в дополнение к '\ п \ п 'он пытается сопоставить, и если применить к большей строке, скорее всего, будет соответствовать еще больше. – cge

Смежные вопросы