Regulärer Ausdruck passend zu einem Punkt


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\.


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']

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 test.this@gmail.com blah blah")
>>> resp.group()
'test.this'

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]

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.


-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 test.this@gmail.com blah blah
blah blah blah test.this @gmail.com blah blah
blah blah blah test.this.this@gmail.com 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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.