2015-01-29 2 views
1

У меня есть текст, который содержит много \n и |. Вот пример:Python Regex соответствие строки между n и |

this is a sample\n text. This symbol | shows what I am talking about. 
This is \n another | sample 

Я хочу, чтобы иметь возможность извлечь все, что между \n и |. Для примера выше это: text. This symbol, а также another Как это сделать в Python 2.7?

+0

является '\ n' символом символа или символа новой строки? –

ответ

1

Вы можете использовать:

s='this is a sample\n text. This symbol | shows what I am talking about.\nThis is \n another | sample' 

>>> print re.findall(r'\n([^|\n]*)\|', s); 
[' text. This symbol ', ' another '] 

Это регулярное выражение захватывает буквального \n следуют шаблону отрицания, который говорит:

([^|\n]*) что означает совпадение 0 или более любых символов, которые не труба или символ новой строки. Квадратные скобки используются для их захвата в группе, которая будет напечатана позже в findall. Он соответствует буквальному | в конце.

Или еще с помощью lookaheads:

>>> print re.findall(r'(?<=\n)[^|\n]*(?= +\|)', s); 
['text. This symbol', 'another'] 
  • (?<=\n) является просмотром назад, что означает, что матч должен предшествовать символ новой строки и пробел
  • (?= +\|) является предпросмотр, что означает, что матч должен следовать пробел и труба.
+0

Спасибо anubhava, не могли бы вы рассказать о том, как они работают? – TJ1

+1

Спасибо за отличное объяснение. – TJ1

+0

Добро пожаловать, рад, что это помогло. – anubhava

1

Использование группы захвата.

re.findall(r'\n([^|]*)\|', string) 

[^|]* соответствует любому символу, но не через | символов, ноль или более раз. По умолчанию re.findall печатает символы, которые присутствуют внутри группы захвата. Таким образом, он печатает промежуточные символы. | - особый метасимвол в регулярном выражении, который действует как оператор чередования. Чтобы соответствовать буквенному символу |, вам необходимо его избежать в своем регулярном выражении.

+0

Спасибо Avinash. Не могли бы вы объяснить, как это работает? – TJ1

+0

объяснено ....... –

+0

Фактически это дает неверный результат для 're.findall (r '\ n ([^ |] *) \ |', 'abc \ n foo \ n bar \ n baz | 123') 'ie' ['foo \ n bar \ n baz'] 'вместо' ['baz'] ' – anubhava

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