<div dir="ltr"><div class="gmail_extra">On Sat, Dec 22, 2012 at 9:53 PM, Albert-Jan Roskam <span dir="ltr"><<a href="mailto:fomcl@yahoo.com" target="_blank">fomcl@yahoo.com</a>></span> wrote:<br><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi,<br>
<br>
Is the code below the only/shortest way to match unicode characters? I would like to match whatever is defined as a character in the unicode reference database. So letters in the broadest sense of the word, but not digits, underscore or whitespace. Until just now, I was convinced that the re.UNICODE flag generalized the [a-z] class to all unicode letters, and that the absence of re.U was an implicit 're.ASCII'. Apparently that mental model was *wrong*.<br>


But [^\W\s\d_]+ is kind of hard to read/write.<br>
<br>
import re<br>
s = unichr(956)  # mu sign<br>
m = re.match(ur"[^\W\s\d_]+", s, re.I | re.U)<br><br></blockquote><div class="gmail_quote"><br></div><div class="gmail_quote" style>A thought would be to rely on the general category of the character, as listed in the Unicode database. Unicodedata.category will give you what you need. Here is a list of categories in the Unicode standard:</div>

<div class="gmail_quote" style><br></div><div class="gmail_quote" style><a href="http://www.fileformat.info/info/unicode/category/index.htm">http://www.fileformat.info/info/unicode/category/index.htm</a><br></div><div class="gmail_quote" style>

<br></div><div class="gmail_quote" style>So, if you wanted only letters, you could say:</div><div class="gmail_quote" style><br></div><div class="gmail_quote" style>def is_unicode_character(c):</div><div class="gmail_quote" style>

    assert len(c) == 1</div><div class="gmail_quote" style>    return 'L' in unicodedata.category(c)</div><div> </div><div style>if only the Letter category will get you what you need, this is pretty simple, but if you also need symbols and marks or something it will start to get more complicated.</div>

<div><br></div><div style>Another thought is to match against two separate regexes, one being \w for alphanumeric and the other being [^\d] to leave you only with alpha. Not exactly ideal either.</div><div style><br></div>

<div style>The last option is to just go with the regex, make sure you write it only once, and leave a nice comment. That's not too bad.</div><div style><br></div><div style>Hugo</div></div></div></div>