Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

a -very- case sensitive search

0 views
Skip to first unread message

Ola K

unread,
Nov 25, 2006, 4:39:55 PM11/25/06
to
Hi,
I am pretty new to Python and I want to make a script that will search
for the following options:
1) words made of uppercase characters -only- (like "YES")
2) words made of lowercase character -only- (like "yes")
3) and words with only the first letter capitalized (like "Yes")
* and I need to do all these considering the fact that not all letters
are indeed English letters.

I went through different documention section but couldn't find a right
condition, function or method for it.
Suggestions will be very much appriciated...
--Ola

Goofy666

unread,
Nov 25, 2006, 5:01:54 PM11/25/06
to
Hi

> * and I need to do all these considering the fact that not all letters
> are indeed English letters.

You mean letters from the English alphabet (derived from the Latin/Roman
alphabet, fyi)? I'm sorry for the nitpicking, but 'English letters'
sounds a bit too 'ackward' to me.

> I went through different documention section but couldn't find a right
> condition, function or method for it.
> Suggestions will be very much appriciated...

I'm still (trying to) learn(ing) it myself, but you can try looking into
using regular expressions. There's a standard module for it (re), see
the PyLib Reference for details; http://docs.python.org/lib/module-re.html.

--Laurens

Dustan

unread,
Nov 25, 2006, 6:03:44 PM11/25/06
to

I'm not sure exactly what you mean by "considering the fact that not
all letters are indeed English letters"; you could mean you don't care
about the non-english characters, or you could mean you don't want any
non-english characters at all (so the function should return False in
that case). If the case is the former, there's a simple test for each:

>>> word = 'hi'
>>> word.upper() == word # evaluates to True if the word is all caps
False
>>> word.lower() == word # evaluates to True if the word is all lowercase
True
>>> word.title() == word # evaluates to True if the word is in a title format
False
>>>

Steven D'Aprano

unread,
Nov 25, 2006, 6:16:02 PM11/25/06
to

At the command prompt:


>>> dir('')
# result edited for clarity
[ ... 'isalnum', 'isalpha', 'isdigit', 'islower',
'isspace', 'istitle', 'isupper', ... ]

Then do this:

>>> help(''.islower)

and read the text it provides. Then experiment on the command line:

>>> 'abcd1234'.islower()
True
>>> 'aBcd1234'.islower()
False

Then come back to us if they aren't suitable, and tell us WHY they aren't
suitable.


--
Steven.

Dustan

unread,
Nov 25, 2006, 6:07:41 PM11/25/06
to

If you're using google groups, it for some reason thought my example
code was 'quoted text', which it certainly isn't, seeing as it's not
found anywhere prior to my message.

Dustan

unread,
Nov 25, 2006, 6:09:51 PM11/25/06
to

Forget what I said; I didn't know about the str.is* methods.

John Machin

unread,
Nov 25, 2006, 6:22:06 PM11/25/06
to

... or about the unicode.is* [same bunch of] methods, which may
possibly address the OP's
"not all letters are indeed English letters" concerns. If he's stuck
with 8-bit str objects, he may need to ensure the locale is set
properly, as vaguely hinted at in the docs that Steven pointed him to.

Cheers,
John

John Machin

unread,
Nov 25, 2006, 9:03:13 PM11/25/06
to

Dustan wrote:

>
> If you're using google groups, it for some reason thought my example
> code was 'quoted text', which it certainly isn't, seeing as it's not
> found anywhere prior to my message.

Sigh. And if we're NOT using Google Groups, it still thinks so ...

The reason is that your "example code" was in fact a screen-dump of a
Python interactive session, in which lines are preceded by ">>>" which
Google Groups simplistically thinks is quoted text from a previous
message.

HTH,
John

Message has been deleted

Paul McGuire

unread,
Nov 26, 2006, 6:11:35 AM11/26/06
to
"Ola K" <ol...@walla.co.il> wrote in message
news:1164490795.8...@45g2000cws.googlegroups.com...
Ola,

You may be new to Python, but are you new to regular expressions too? I am
no wiz at them, but here is a script that takes a stab at what you are
trying to do. (For more regular expression info, see
http://www.amk.ca/python/howto/regex/.)

The script has these steps:
- create strings containing all unicode chars that are considered "lower"
and "upper", using the unicode.is* methods
- use these strings to construct 3 regular expressions (or "re"s), one for
words of all lowercase letters, one for words of all uppercase letters, and
one for words that start with an uppercase letter followed by at least one
lowercase letter.
- use each re to search the string u"YES yes Yes", and print the found
matches

I've used unicode strings throughout, so this should be applicable to your
text consisting of letters beyond the basic Latin set (since Outlook Express
is trying to install Israeli fonts when reading your post, I assume these
are the characters you are trying to handle). You may have to do some setup
of your locale for proper handling of unicode.isupper, etc., but I hope this
gives you a jump start on your problem.

-- Paul


import sys
import re

uppers = u"".join( unichr(i) for i in range(sys.maxunicode)
if unichr(i).isupper() )
lowers = u"".join( unichr(i) for i in range(sys.maxunicode)
if unichr(i).islower() )

allUpperRe = ur"\b[%s]+\b" % uppers
allLowerRe = ur"\b[%s]+\b" % lowers
capWordRe = ur"\b[%s][%s]+\b" % (uppers,lowers)

regexes = [
(allUpperRe, "all upper"),
(allLowerRe, "all lower"),
(capWordRe, "title case"),
]
for reString,label in regexes:
reg = re.compile(reString)
result = reg.findall(u" YES yes Yes ")
print label,":",result

Prints:
all upper : [u'YES']
all lower : [u'yes']
title case : [u'Yes']


John Machin

unread,
Nov 26, 2006, 6:46:06 AM11/26/06
to

I'd guessed the OP was in Israel from his e-mail address. If that's
what Outlook Express is doing, then that's conclusive proof :-)

An aside to the OP: Pardon my ignorance, but does Hebrew have upper and
lower case?

> You may have to do some setup
> of your locale for proper handling of unicode.isupper, etc.,

Whatever gave you that impression?

> but I hope this
> gives you a jump start on your problem.
>
> -- Paul
>
>
> import sys
> import re
>
> uppers = u"".join( unichr(i) for i in range(sys.maxunicode)
> if unichr(i).isupper() )
> lowers = u"".join( unichr(i) for i in range(sys.maxunicode)
> if unichr(i).islower() )

Just in case the OP is running a 32-bit unicode implementation, you
might want to make that xrange, not range :-)

>
> allUpperRe = ur"\b[%s]+\b" % uppers
> allLowerRe = ur"\b[%s]+\b" % lowers
> capWordRe = ur"\b[%s][%s]+\b" % (uppers,lowers)
>
> regexes = [
> (allUpperRe, "all upper"),
> (allLowerRe, "all lower"),
> (capWordRe, "title case"),
> ]
> for reString,label in regexes:
> reg = re.compile(reString)
> result = reg.findall(u" YES yes Yes ")
> print label,":",result
>
> Prints:
> all upper : [u'YES']
> all lower : [u'yes']
> title case : [u'Yes']

Cheers,
John

Paul McGuire

unread,
Nov 26, 2006, 6:54:49 AM11/26/06
to

"John Machin" <sjma...@lexicon.net> wrote in message
news:1164541566.2...@l12g2000cwl.googlegroups.com...
>
John -

Thanks for the updates. Comments below...

-- Paul

> Paul McGuire wrote:
>
>> You may have to do some setup
>> of your locale for proper handling of unicode.isupper, etc.,
>
> Whatever gave you that impression?
>

Nothing. Just my own ignorance of unicode and i18n. This post really is
just string mechanics and re's - I wasn't sure I had all the underlying
unicode stuff right.

>> uppers = u"".join( unichr(i) for i in range(sys.maxunicode)
>> if unichr(i).isupper() )
>> lowers = u"".join( unichr(i) for i in range(sys.maxunicode)
>> if unichr(i).islower() )
>
> Just in case the OP is running a 32-bit unicode implementation, you
> might want to make that xrange, not range :-)
>

Good tip. I rarely use xrange, it seems like such a language wart. Isn't
"range" going to become what "xrange" is in Py3k?

Ola K

unread,
Dec 2, 2006, 11:23:15 AM12/2/06
to
Thank you! This was really helpful. Also the data bit about .istitle()
was the missinng piece of the puzzle for me... So now my script is nice
and working :)

And as beside the point, yes I am from Israel, and no, we don't have
uper case and lower case letters. Hebrew has only one set of letters.
So my script was actualy for the english letters inside the hebrew
text...

--Ola

Paul McGuire כתב:

0 new messages