
Könnte ich ein Beispiel dafür bekommen, wie sich diese drei Elemente (heißen diese Metazeichen?) unterscheiden?
Ich weiß, das *
bedeutet alles oder nichts, aber ich bin mir nicht sicher, ob das die richtige Art ist, darüber nachzudenken. Andererseits .
scheinen beide ?
gleich zu sein. Sie entsprechen einem Zeichen, richtig?
Antwort1
Sie können verwirrend seinReguläre AusdrückemitShell-Globs
In der Syntax regulärer Ausdrücke .
stellt jedes einzelne Zeichen dar (normalerweise mit Ausnahme des Zeilenumbruchzeichens), während *
es sich um einQuantorbedeutet null oder mehr des vorhergehenden Regex-Atoms (Zeichen oder Gruppe). ?
ist ein Quantifizierer, der null odereinsInstanzen des vorhergehenden Atoms oder (in Regex-Varianten, die dies unterstützen) einModifikatorDadurch wird das Quantifiziererverhalten auf nicht gierig eingestellt.
In Shell-Globs ?
stellt es ein einzelnes Zeichen dar (wie der reguläre Ausdruck .
), während *
es eine Folge von null oder mehr Zeichen darstellt (entspricht dem regulären Ausdruck .*
).
Einige Referenzen, die Sie möglicherweise hilfreich finden, sindhttp://www.regular-expressions.info/quickstart.htmlUndhttp://mywiki.wooledge.org/glob
Antwort2
Direkt übernommen vonWikipedia:
? Das Fragezeichen gibt an, dass das vorangehende Element null oder einmal vorkommt. Beispielsweise entspricht colou?r sowohl „color“ als auch „colour“.
*Das Sternchen gibt an, dass das vorangehende Element null oder öfter vorkommt. Beispielsweise entspricht ab*c „ac“, „abc“, „abbc“, „abbbc“ usw.
Der große Unterschied besteht darin, dass AsteriskNull oder mehrVorkommen, während Fragezeichen übereinstimmtNull oder EinsVorkommen. Vergleichen Sie diese beiden Beispiele:
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'
colour
color
colouur
Da colouur
der Buchstabe u (das vorherige Element vor dem Qualifizierer ?
) mehr als einmal vorkommt, wird er nicht mit abgeglichen ?
, sondern mit*
Ähnliches Beispiel:
$ printf "error\neror\ner\n" | egrep 'er?or'
eror
$ printf "error\neror\ner\n" | egrep 'er*or'
error
eror
Von derselben Wikipedia-Seite:
Stimmt mit jedem einzelnen Zeichen überein (viele Anwendungen schließen Zeilenumbrüche aus, und welche Zeichen genau als Zeilenumbrüche gelten, ist typ-, zeichenkodierungs- und plattformspezifisch, aber man kann davon ausgehen, dass das Zeilenvorschubzeichen eingeschlossen ist). Innerhalb von POSIX-Klammerausdrücken stimmt das Punktzeichen mit einem wörtlichen Punkt überein. Beispielsweise stimmt ac mit „abc“ usw. überein, aber [ac] stimmt nur mit „a“, „.“ oder „c“ überein.
In unserem Beispiel
$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'
colouur
Passenderweise lautet der letzte Satz wie folgt:match any line that has "colou", plus any character, plus letter "r"
Abschluss
Sie haben gefragt: „Ich weiß, dass ‚*‘ alles oder nichts bedeutet, aber ich bin nicht sicher, ob ich das richtig verstehen soll. Andererseits scheinen ‚.‘ und ‚?‘ dasselbe zu sein.“ Wie Sie sehen, sind Punkt und Sternchen nicht genau dasselbe. Der Punkt wirkt auf jedes Zeichen, das diese bestimmte Position einnimmt, während das Fragezeichen auf das vorangehende Element wirkt.
Antwort3
Hinweis: Examples provided are in Python.
Das Konzept bleibt jedoch dasselbe.
'.'
ist einpassendes Symboldas mit jedem Zeichen übereinstimmt, außerZeilenumbruchzeichen(auch dies kann überschrieben werden mitre.DOTALL
in Python mit einem Argument überschrieben werden). Daher wird es auch alsWildcard.
'*'
ist einQuantor(definiert, wie oft ein Element vorkommen kann). Ist die Abkürzung für{0,}.
Es bedeutet„übereinstimmung mit null oder mehr“– die Gruppe vor dem Stern kann beliebig oft im Text vorkommen. Sie kann ganz fehlen oder sich immer wieder wiederholen.
'?'
ist auch einQuantor. Ist die Abkürzung für{0,1}.
Es bedeutet„Entspricht null oder einem der diesem Fragezeichen vorangehenden Gruppen.“Es kann auch interpretiert werden alsder Teil vor dem Fragezeichen ist optional.
z.B:
pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'
mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'
Im obigen Beispiel bedeutet „?“, dass die beiden davor stehenden Ziffern optional sind. Sie dürfen nicht oder höchstens einmal vorkommen.
Unterschied zwischen '.' und '?':
'.'
stimmt überein/akzeptiert/überprüftjedes einzelne Zeichenfür den Platz, den es im regulären Ausdruck einnimmt.
z.B:
pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']
'?'
stimmt mit dem Null- oder Einzelvorkommen desGruppe davor.
Sehen Sie sich das Beispiel einer Mobiltelefonnummer an.
Das Gleiche gilt für'*'
. Es wird geprüftnull oder mehr Vorkommen der Gruppe davor.
Kombination:
'.*'
: Akzeptiert so viele Sequenzen wie verfügbar.Gieriger Ansatz.
'.*?
' Akzeptiert die erste übereinstimmende Sequenz und stoppt.Nicht-gieriger Ansatz
Weitere Informationen erhalten Sie, wenn Sie die folgenden beiden Fragen lesen …