Groß- und Kleinschreibung wird nicht berücksichtigt, ohne erneut zu kompilieren?

329

In Python kann ich einen regulären Ausdruck so kompilieren, dass die Groß- und Kleinschreibung nicht berücksichtigt wird re.compile.

>>> s = 'TeSt'
>>> casesensitive = re.compile('test')
>>> ignorecase = re.compile('test', re.IGNORECASE)
>>> 
>>> print casesensitive.match(s)
None
>>> print ignorecase.match(s)
<_sre.SRE_Match object at 0x02F0B608>

Gibt es eine Möglichkeit, dasselbe zu tun, aber ohne es zu benutzen re.compile? Ich kann nichts wie Perls iSuffix (zB m/test/i) in der Dokumentation finden.

Matte
quelle
1
Eine ausgezeichnete Einführung in reguläre Experssoins finden Sie unter: python-course.eu/re.php
2Obe

Antworten:

560

Fahren Sie re.IGNORECASEmit dem flagsparam von search, matchoder sub:

re.search('test', 'TeSt', re.IGNORECASE)
re.match('test', 'TeSt', re.IGNORECASE)
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)
Michael Haren
quelle
2
re.match('test', 'TeSt', re.IGNORECASE)könnte dazu führen, TypeErrordass eines der Attribute ist None. Verwenden Sie try & except, um den TypeErrorAbgleich mit first_string == second_string abzufangen. Beispielcode def equal_ignore_case(first_string, second_string): try: return re.match(first_string, second_string, re.IGNORECASE) is not None except (AttributeError, TypeError): return first_string == second_string Demo Code
Abhijeet
3
@Abhijeet Du solltest try / wirklich nicht verwenden, außer in diesem Fall. Überprüfen Sie einfach, ob eine der Zeichenfolgen an Noneerster Stelle steht.
Erb
Es ist wichtig, das genannte Argument flagszu verwenden, re.subda es sonst re.IGNORECASEan das countArgument übergeben wird (s. Auch stackoverflow.com/questions/42581/… )
L3n95
101

Sie können auch Suchvorgänge ohne Berücksichtigung der Groß- und Kleinschreibung mit search / match ohne das Flag IGNORECASE durchführen (getestet in Python 2.7.3):

re.search(r'(?i)test', 'TeSt').group()    ## returns 'TeSt'
re.match(r'(?i)test', 'TeSt').group()     ## returns 'TeSt'
aem999
quelle
2
In der Dokumentation wird nicht erwähnt, dass die Funktion in einer bestimmten Version hinzugefügt wurde (im Gegensatz zu der Funktion, (?(condition)yes|no)die in 2.4 hinzugefügt wurde). Ich gehe daher davon aus, dass sie seit der ersten Version des reModuls, die meiner Meinung nach hinzugefügt wurde, immer verfügbar war in 1.5. Grundsätzlich seit Beginn der Zeit in jeder Hinsicht, wenn es um Python geht. Es ist ungefähr in der Mitte
ArtOfWarfare
4
Los geht's - ich habe die Dokumentation für 1.5 durchgesehen und festgestellt, dass sie zu etwa 60% auf dieser Seite dokumentiert ist : docs.python.org/release/1.5/lib/… Ich habe auch die 1.4-Dokumentation überprüft, die nicht erwähnt wurde Dieses Feature. Ich denke, es wurde in 1.5 hinzugefügt, als das regexModul zugunsten des reModuls veraltet war .
ArtOfWarfare
3
Dies ist eine schöne Lösung, da keine Flagge erforderlich ist. In meinem Fall speichere ich Suchzeichenfolgen in Redis und das ist wirklich hilfreich.
Privat
3
@Private: Konzeptionell setzt es das re.I-Flag für den gesamten regulären Ausdruck - nicht nur für die Erfassungsgruppe, der es vorausgeht. Beachten Sie, re.match(r'''A ((?i)B) C''', "a b c").group(0)dass bei allem (A und C), nicht nur bei B, die Übereinstimmung zwischen Groß- und Kleinschreibung nicht berücksichtigt wird! Wenn Sie nur Groß- und Kleinschreibung für eine bestimmte Erfassungsgruppe suchen, ist dies nicht der gesuchte Droide.
smci
1
@Private: ja total. Mein Punkt ist konzeptionell das gleiche wie das Setzen einer Flagge. Auf die gesamte Regex. Sogar die Gruppen, die davor stehen (!). Es gibt keine Syntax, die besagt, dass nur bei den folgenden Erfassungsgruppen die Groß- und Kleinschreibung nicht berücksichtigt wird.
smci
53

Der Marker, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, (?i)kann direkt in das Regex-Muster integriert werden:

>>> import re
>>> s = 'This is one Test, another TEST, and another test.'
>>> re.findall('(?i)test', s)
['Test', 'TEST', 'test']
Raymond Hettinger
quelle
2
Bessere Option, macht den Regex plattformübergreifend portabel und die Absicht ist bei der Erklärung klar
Sina Madani
1
Dieser '(?i)'Ansatz hat auch den Vorteil, dass Sie eine Liste von regulären Ausdrücken erstellen können, von denen einige die Groß- und Kleinschreibung nicht berücksichtigen und andere nicht. (Und natürlich können Sie re.compilediese Liste abbilden , wenn Sie möchten.)
nicht nur Yeti
@ SinaMadani Ich bin verwirrt. Wie ist das tragbarer als flags=re.IGNORECASE?
Romain Vincent
10

Sie können beim Kompilieren von Mustern auch festlegen, dass die Groß- und Kleinschreibung nicht berücksichtigt wird:

pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)
Panofish
quelle
5
In der Frage verwendet OP dies und fragt, ob es einen anderen Weg gibt, dies zu tun.
Peter Wood
6
Hilfreich für die schnell scrollenden.
Stevek
6

Bei Importen

import re

In der Laufzeitverarbeitung:

RE_TEST = r'test'
if re.match(RE_TEST, 'TeSt', re.IGNORECASE):

Es sollte erwähnt werden, dass die re.compileNichtverwendung verschwenderisch ist. Jedes Mal, wenn die obige Übereinstimmungsmethode aufgerufen wird, wird der reguläre Ausdruck kompiliert. Dies ist auch in anderen Programmiersprachen fehlerhaft. Das Folgende ist die bessere Praxis.

In der App-Initialisierung:

self.RE_TEST = re.compile('test', re.IGNORECASE)

In der Laufzeitverarbeitung:

if self.RE_TEST.match('TeSt'):
Douglas Daseeco
quelle
1
Vielen Dank! Niemand spricht jemals über Kompilieren, aber es ist die klügste Option!
StefanJCollier
2
Das OP fragt buchstäblich nach einer Lösung, die nicht verwendet wird re.compile()...
wpercy
4
#'re.IGNORECASE' for case insensitive results short form re.I
#'re.match' returns the first match located from the start of the string. 
#'re.search' returns location of the where the match is found 
#'re.compile' creates a regex object that can be used for multiple matches

 >>> s = r'TeSt'   
 >>> print (re.match(s, r'test123', re.I))
 <_sre.SRE_Match object; span=(0, 4), match='test'>
 # OR
 >>> pattern = re.compile(s, re.I)
 >>> print(pattern.match(r'test123'))
 <_sre.SRE_Match object; span=(0, 4), match='test'>
Jackotonye
quelle
4

Geben Sie re.IGNORECASE an, um Vorgänge ohne Berücksichtigung der Groß- und Kleinschreibung auszuführen

>>> import re
>>> test = 'UPPER TEXT, lower text, Mixed Text'
>>> re.findall('text', test, flags=re.IGNORECASE)
['TEXT', 'text', 'Text']

und wenn wir Text ersetzen wollen, der zum Fall passt ...

>>> def matchcase(word):
        def replace(m):
            text = m.group()
            if text.isupper():
                return word.upper()
            elif text.islower():
                return word.lower()
            elif text[0].isupper():
                return word.capitalize()
            else:
                return word
        return replace

>>> re.sub('text', matchcase('word'), test, flags=re.IGNORECASE)
'UPPER WORD, lower word, Mixed Word'
Srivastava
quelle
1

Wenn Sie ersetzen möchten, aber den Stil der vorherigen str beibehalten möchten. Es ist möglich.

Beispiel: Markieren Sie die Zeichenfolge "test asdasd TEST asd tEst asdasd".

sentence = "test asdasd TEST asd tEst asdasd"
result = re.sub(
  '(test)', 
  r'<b>\1</b>',  # \1 here indicates first matching group.
  sentence, 
  flags=re.IGNORECASE)

test asdasd TEST asd tEst asdasd

Dat Nguyen
quelle
0

Für reguläre Ausdrücke ohne Berücksichtigung der Groß- und Kleinschreibung (Regex): Es gibt zwei Möglichkeiten, indem Sie Ihren Code hinzufügen:

  1. flags=re.IGNORECASE

    Regx3GList = re.search("(WCDMA:)((\d*)(,?))*", txt, **re.IGNORECASE**)
  2. Der Marker, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird (?i)

    Regx3GList = re.search("**(?i)**(WCDMA:)((\d*)(,?))*", txt)
Aliakbar Hosseinzadeh
quelle