ignore case only for a part of the regex?

wxjmfauth at gmail.com wxjmfauth at gmail.com
Wed Jan 2 15:17:04 CET 2013


Le mercredi 2 janvier 2013 00:09:45 UTC+1, Vlastimil Brom a écrit :
> 2013/1/1 Steven D'Aprano <steve+comp.lang.python at pearwood.info>:
> 
> > On Sun, 30 Dec 2012 10:20:19 -0500, Roy Smith wrote:
> 
> >
> 
> >> The way I would typically do something like this is build my regexes in
> 
> >> all lower case and .lower() the text I was matching against them.  I'm
> 
> >> curious what you're doing where you want to enforce case sensitivity in
> 
> >> one part of a header, but not in another.
> 
> >
> 
> > Well, sometimes you have things that are case sensitive, and other things
> 
> > which are not, and sometimes you need to match them at the same time. I
> 
> > don't think this is any more unusual than (say) wanting to match an
> 
> > otherwise lowercase word whether or not it comes at the start of a
> 
> > sentence:
> 
> >
> 
> > "[Pp]rogramming"
> 
> >
> 
> > is conceptually equivalent to "match case-insensitive `p`, and case-
> 
> > sensitive `rogramming`".
> 
> >
> 
> >
> 
> > By the way, although there is probably nothing you can (easily) do about
> 
> > this prior to Python 3.3, converting to lowercase is not the right way to
> 
> > do case-insensitive matching. It happens to work correctly for ASCII, but
> 
> > it is not correct for all alphabetic characters.
> 
> >
> 
> >
> 
> > py> 'Straße'.lower()
> 
> > 'straße'
> 
> > py> 'Straße'.upper()
> 
> > 'STRASSE'
> 
> >
> 
> >
> 
> > The right way is to casefold first, then match:
> 
> >
> 
> > py> 'Straße'.casefold()
> 
> > 'strasse'
> 
> >
> 
> >
> 
> > Curiously, there is an uppercase ß in old German. In recent years some
> 
> > typographers have started using it instead of SS, but it's still rare,
> 
> > and the official German rules have ß transform into SS and vice versa.
> 
> > It's in Unicode, but few fonts show it:
> 
> >
> 
> > py> unicodedata.lookup('LATIN CAPITAL LETTER SHARP S')
> 
> > 'ẞ'
> 
> >
> 
> >
> 
> >
> 
> > --
> 
> > Steven
> 
> > --
> 
> > http://mail.python.org/mailman/listinfo/python-list
> 
> 
> 
> Hi,
> 
> just for completeness, the mentioned regex library can take care of
> 
> casfolding in case insensitive matching (in all supported versions:
> 
> Python 2.5-2.7 and 3.1-3.3); i.e.:
> 
> # case sensitive match:
> 
> >>> for m in regex.findall(ur"Straße", u" STRAßE STRASSE STRAẞE Strasse Straße "): print m
> 
> ...
> 
> Straße
> 
> 
> 
> # case insensitive match:
> 
> >>> for m in regex.findall(ur"(?i)Straße", u" STRAßE STRASSE STRAẞE Strasse Straße "): print m
> 
> ...
> 
> STRAßE
> 
> STRAẞE
> 
> Straße
> 
> 
> 
> # case insensitive match with casefolding:
> 
> >>> for m in regex.findall(ur"(?if)Straße", u" STRAßE STRASSE STRAẞE Strasse Straße "): print m
> 
> ...
> 
> STRAßE
> 
> STRASSE
> 
> STRAẞE
> 
> Strasse
> 
> Straße
> 
> >>>
> 
> >>>
> 
> 
> 
> # after enabling the backwards incompatible modern matching behaviour,
> 
> casefolding is by default turned on for case insensitive matches
> 
> >>> for m in regex.findall(ur"(?V1i)Straße", u" STRAßE STRASSE STRAẞE Strasse Straße "): print m
> 
> ...
> 
> STRAßE
> 
> STRASSE
> 
> STRAẞE
> 
> Strasse
> 
> Straße
> 
> >>>
> 
> 
> 
> 
> 
> As a small addition, the originally posted pattern r'^Msg-(?:(?i)id):'
> 
> would actually work as expected in this modern matching mode in regex
> 
> - enabled with the V1 flag. In this case the flag-setting (?i) only
> 
> affects the following parts of the pattern, not the whole pattern like
> 
> in the current "re" and V0-compatibility-mode "regex"
> 
> 
> 
> >>> regex.findall(r"(?V1)Msg-(?:(?i)id):", "the regex should match  Msg-id:, Msg-Id:, ...  but not  msg-id:, MSG-ID:  and so on")
> 
> ['Msg-id:', 'Msg-Id:']
> 

------

Vlastimil:

Excellent.

-----

Steven:

..." It's in Unicode, but few fonts show it:" ...

Das grosse Eszett is a member of the unicode subsets MES-2, WGL-4.
Good - serious - fonts are via OpenType MES-2 or WGL-4 compliant.
So, it is a no problem.

I do not know (and I did not check) if the code point, 1e9e, is part of
the utf32 table.

jmf



More information about the Python-list mailing list