 <p>Your input text is full of a mix of word and non-word characters, so the only way to determine a word boundary is to look behind and ahead for spaces:</p> <pre><code>re.findall(ur'(?&lt;![^ ])വി[^ ]+ണ്?(?![^ ])', inputtext, flags=re.UNICODE) </code></pre> <p>where <code>inputtext</code> is a Unicode value. The <code>(?&lt;!...)</code> and <code>(?!...)</code> are negative lookbehind and lookahead assertions; the match locations in the text that are <em>not</em> preceded or followed by a non-space character, respectively.</p> <p>Within your boundary text, we match non-spaces as well.</p> <p>This matches your expected input:</p> <pre><code>&gt;&gt;&gt; print re.findall(ur'(?&lt;![^ ])വി[^ ]+ണ്?(?![^ ])', inputtext, flags=re.UNICODE)[0] വിചാരണ </code></pre>