Reputation: 15588
While trying to learn a little more about regular expressions, a tutorial suggested that you can use the \b
to match a word boundary. However, the following snippet in the Python interpreter does not work as expected:
>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)
It should have been a match object if anything was matched, but it is None
.
Is the \b
expression not supported in Python or am I using it wrong?
Upvotes: 133
Views: 79746
Reputation: 6524
just a note, for dynamic variable this will not work
x = 'one two three'
dy = "two"
y = re.search(r"\b" + dy + "\b", x)
print(y) # None
use r"\b"
on left and right
x = 'one two three'
dy = "two"
y = re.search(r"\b" + dy + r"\b", x)
print(y) # <re.Match object; span=(4, 7), match='two'>
Upvotes: -1
Reputation: 66709
You should be using raw strings in your code
>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>>
Also, why don't you try
word = 'two'
re.compile(r'\b%s\b' % word, re.I)
Output:
>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>
Upvotes: 120
Reputation: 405775
Just to explicitly explain why re.search("\btwo\b", x)
doesn't work, it's because \b
in a Python string is shorthand for a backspace character.
print("foo\bbar")
fobar
So the pattern "\btwo\b"
is looking for a backspace, followed by two
, followed by another backspace, which the string you're searching in (x = 'one two three'
) doesn't have.
To allow re.search
(or compile
) to interpret the sequence \b
as a word boundary, either escape the backslashes ("\\btwo\\b"
) or use a raw string to create your pattern (r"\btwo\b"
).
Upvotes: 25
Reputation: 382980
Python documentation
https://docs.python.org/2/library/re.html#regular-expression-syntax
\b
Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of alphanumeric or underscore characters, so the end of a word is indicated by whitespace or a non-alphanumeric, non-underscore character. Note that formally, \b is defined as the boundary between a \w and a \W character (or vice versa), or between \w and the beginning/end of the string, so the precise set of characters deemed to be alphanumeric depends on the values of the UNICODE and LOCALE flags. For example, r'\bfoo\b' matches 'foo', 'foo.', '(foo)', 'bar foo baz' but not 'foobar' or 'foo3'. Inside a character range, \b represents the backspace character, for compatibility with Python’s string literals.
Upvotes: 10
Reputation: 11690
This will work: re.search(r"\btwo\b", x)
When you write "\b"
in Python, it is a single character: "\x08"
. Either escape the backslash like this:
"\\b"
or write a raw string like this:
r"\b"
Upvotes: 110