Regulärer Ausdruck passend zu einem Punkt

90

Frage mich , was der beste Weg , entsprechen ist "test.this"aus "blah blah blah [email protected] blah blah"liegt? Python verwenden.

ich habe es versucht re.split(r"\b\w.\w@")

Georgy
quelle
\wpasst nur zu einem einzelnen Charakter - Sie wollen wahrscheinlich\w+
Peter Boughton
2
Hier ist ein regulärer Ausdruck für die E-Mail-Validierung, falls Sie einen suchen.
Chuckmash

Antworten:

146

Ein .in Regex ist ein Metazeichen, das verwendet wird, um mit einem beliebigen Zeichen übereinzustimmen. Um einem wörtlichen Punkt zu entsprechen, müssen Sie ihn also maskieren\.

Yuushi
quelle
43

In Ihrem regulären Ausdruck müssen Sie dem Punkt entkommen"\." oder ihn innerhalb einer Zeichenklasse verwenden "[.]" , da es sich um ein Metazeichen im regulären Ausdruck handelt, das mit jedem Zeichen übereinstimmt.

Außerdem müssen Sie \w+statt \weines oder mehrerer Wortzeichen übereinstimmen.


Wenn Sie den test.thisInhalt möchten , splitist dies nicht das, was Sie brauchen. splitwird Ihre Saite um die teilen test.this. Beispielsweise:

>>> re.split(r"\b\w+\.\w+@", s)
['blah blah blah ', 'gmail.com blah blah']

Sie können verwenden re.findall:

>>> re.findall(r'\w+[.]\w+(?=@)', s)   # look ahead
['test.this']
>>> re.findall(r'(\w+[.]\w+)@', s)     # capture group
['test.this']
Rohit Jain
quelle
2
+1 für die Zeichenklasse. Wenn Sie gcovr aus einer Jenkins-Datei verwenden und versuchen, Punktverzeichnisse auszuschließen, versteht Jenkins Escape-Sequenzen nicht. Die Charakterklasse hat wunderbar funktioniert.
Jonathan Landrum
12

"Im Standardmodus stimmt Punkt (.) Mit jedem Zeichen außer einer neuen Zeile überein. Wenn das DOTALL-Flag angegeben wurde, entspricht dies jedem Zeichen, einschließlich einer neuen Zeile." (Python Doc)

Wenn Sie also die Punktliteratur bewerten möchten, sollten Sie sie in eckige Klammern setzen:

>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah [email protected] blah blah")
>>> resp.group()
'test.this'
StackUser
quelle
1

In Javascript müssen Sie \ verwenden. einen Punkt abgleichen.

Beispiel

"blah.tests.zibri.org".match('test\\..*')
null

und

"blah.test.zibri.org".match('test\\..*')
["test.zibri.org", index: 5, input: "blah.test.zibri.org", groups: undefined]
Zibri
quelle
0

Um nicht-alphanumerische Zeichen von Zeichenfolgenvariablen, einschließlich Punkten, zu umgehen, können Sie Folgendes verwenden re.escape:

import re

expression = 'whatever.v1.dfc'
escaped_expression = re.escape(expression)
print(escaped_expression)

Ausgabe:

whatever\.v1\.dfc

Sie können den maskierten Ausdruck verwenden, um die Zeichenfolge buchstäblich zu finden / abzugleichen.

Ali Abul Hawa
quelle
-1

Dieser Ausdruck,

(?<=\s|^)[^.\s]+\.[^.\s]+(?=@)

funktioniert möglicherweise auch für diese bestimmten Arten von Eingabezeichenfolgen in Ordnung.

Demo

Prüfung

import re

expression = r'(?<=^|\s)[^.\s]+\.[^.\s]+(?=@)'
string = '''
blah blah blah [email protected] blah blah
blah blah blah test.this @gmail.com blah blah
blah blah blah [email protected] blah blah
'''

matches = re.findall(expression, string)

print(matches)

Ausgabe

['test.this']

Wenn Sie den Ausdruck vereinfachen / ändern / untersuchen möchten, wurde dies im oberen rechten Bereich von regex101.com erläutert . Wenn Sie möchten , können Sie in diesem Link auch sehen , wie es mit einigen Beispieleingaben übereinstimmt.


Emma
quelle