Hipale
Hipale

Reputation: 35

Regular Expressions: Special Characters and Tab Spaces

I was testing out a function that I wrote. It is supposed to give me the count of full stops (.) in a line or string. The full stop (.) that I am interested in counting has a tab space before and after it.

Here is what I have written.

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

However, when I test it, it returns 0. From a, there are 2 full stops (.) with both a tab space before and after it. Am I using regular expressions improperly? Represented a incorrectly? Any help is appreciated.

Thanks.

Upvotes: 0

Views: 1227

Answers (2)

Akinakes
Akinakes

Reputation: 657

It will work if you replace the '\t' with a single tab key press.

Note that count only counts non-overlapping occurrences of a substring so it won't work as intended unless you use regex instead, or change your substring to only test for a tab in front of the period.

Upvotes: 0

Floris
Floris

Reputation: 46405

It doesn't look like a has any tabs in it. Although you may have hit the tab key on your keyboard, that character would have been interpreted by the text editor as "insert a number of spaces to align with the next tab character". You need your line to look like this:

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

That should do it.

A more complete example:

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

This uses "lookahead" and "lookbehind" to match the tab character without consuming it. What does that mean? It means that when you have \t.\t.\t, you will actually match both the first and the second \.. The original expression would have matched the initial \t\.\t and discarded them. After, there would have been a \. with nothing in front of it, and thus no second match. The lookaround syntax is "zero width" - the expression is tested but it ends up taking no space in the final match. Thus, the code snippet I just gave returns 2, just as you would expect.

Upvotes: 3

Related Questions