2013-06-30 5 views
0

Я тестировал функцию, которую я написал. Он должен дать мне количество полных остановок (.) В строке или строке. Полная остановка (.), Которую меня интересует, имеет вкладку до и после нее.Регулярные выражения: специальные символы и области табуляции

Вот что я написал.

def Seek(): 
    a = '1 . . 3 .' 
    b = a.count(r'\t\.\t') 
    return b 
Seek() 

Однако, когда я проверить это, она возвращает 0. Из а, есть 2 полные остановки (.) С обеими вкладками пространства до и после него. Я использую регулярные выражения ненадлежащим образом? Представьте неправильно? Любая помощь приветствуется.

Спасибо.

ответ

3

Не похоже, что у a есть любые вкладки. Хотя вы, возможно, нажали клавишу tab на клавиатуре, этот символ был бы интерпретирован текстовым редактором как «вставить несколько пробелов для выравнивания со следующим символом табуляции». Вам нужна ваша линия, чтобы она выглядела так:

a = '1\t.\t.\t3\t.' 

Это должно быть сделано.

Более полный пример:

from re import * 
def Seek(): 
    a = '1\t.\t.\t3\t\.' 
    re = compile(r'(?<=\t)\.(?=\t)'); 
    return len(re.findall(a)) 
print Seek() 

Это использует «предпросмотр» и «» для просмотра назад соответствовать tab характер , не потребляя его. Что это значит? Это означает, что когда у вас есть \t.\t.\t, вы фактически будете соответствовать как первым, так и второму \.. Исходное выражение должно совпадать с начальным \t\.\tи отбросить их. После этого был бы \., и ничего не было бы перед ним, и, следовательно, не было второго матча. Синтаксис lookaround - «нулевая ширина» - выражение проверено, но в конечном итоге оно не занимает места в финальном матче. Таким образом, фрагмент кода, который я только что дал, возвращает 2, как и следовало ожидать.

+0

Спасибо! Однако, что, если бы я хотел общее количество полных остановок (.), Чтобы возвращалось значение 3? Как включить последнюю полную остановку, у которой нет вкладки после нее, без подсчета или дублирования других вхождений, которые имеют обе вкладки до и после? – Hipale

+0

Ну, вы сказали: «У вас есть вкладка до и после нее» ... Если вам не нужна вкладка после, вы просто не обращаете внимание на часть регулярного выражения: so 're = compile (r '(? <= \ t) \. '); 'нужно делать это - не проверять на iPhone. – Floris

+0

Ничего. Я думаю, что я понял это с помощью «split». – Hipale

0

Он будет работать, если вы замените '\ t' нажатием одной клавиши табуляции.

Обратите внимание, что счетчик подсчитывает только неперекрывающиеся вхождения подстроки, поэтому он не будет работать должным образом, если вы не используете регулярное выражение или не измените подстроку, чтобы проверить только вкладку перед периодом.

+0

Нажатие клавиши вкладок не всегда вставляет символ табуляции, который полностью зависит от используемого редактора. – Floris

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