Wyrażenie regularne do dopasowania kropki


Odpowiedzi:


169

A .w wyrażeniu regularnym jest metaznakiem, służy do dopasowania dowolnego znaku. Aby dopasować dosłowną kropkę, musisz od niej uciec, więc\.


46

W swoim wyrażeniu regularnym musisz uciec przed kropką "\."lub użyć go wewnątrz klasy znaków "[.]" , ponieważ jest to metaznak w wyrażeniu regularnym, który pasuje do dowolnego znaku.

\w+Zamiast tego musisz \wdopasować jeden lub więcej znaków słownych.


Teraz, jeśli chcesz test.thistreści, splitto nie jest to, czego potrzebujesz. splitpodzieli twój ciąg wokół test.this. Na przykład:

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

Możesz użyć re.findall:

>>> re.findall(r'\w+[.]\w+(?=@)', s)   # look ahead
['test.this']
>>> re.findall(r'(\w+[.]\w+)@', s)     # capture group
['test.this']

2
+1 dla klasy postaci. Korzystanie z gcovr z pliku Jenkinsfile i próba wykluczenia katalogów z kropkami, a Jenkins nie rozumie sekwencji ucieczki. Klasa postaci działała pięknie.
Jonathan Landrum

13

„W trybie domyślnym kropka (.) Dopasowuje dowolny znak z wyjątkiem nowej linii. Jeśli określono flagę DOTALL, oznacza to dopasowanie do dowolnego znaku, w tym nowej linii.” (python Doc)

Tak więc, jeśli chcesz oceniać kropkę dosłownie, myślę, że powinieneś umieścić ją w nawiasach kwadratowych:

>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah test.this@gmail.com blah blah")
>>> resp.group()
'test.this'

0

W javascript musisz użyć \. aby dopasować kropkę.

Przykład

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

i

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

prosi o Pythona, a nie JS
pl-jay

0

aby uniknąć niealfanumerycznych znaków zmiennych łańcuchowych, w tym kropek, możesz użyć re.escape:

import re

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

wynik:

whatever\.v1\.dfc

możesz użyć wyrażenia ze znakiem ucieczki, aby znaleźć / dopasować ciąg dosłownie.


-3

To wyrażenie,

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

może również działać poprawnie dla tych określonych typów ciągów wejściowych.

Próbny

Test

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)

Wynik

['test.this']

Jeśli chcesz uprościć / zmodyfikować / zbadać wyrażenie, zostało to wyjaśnione w prawym górnym panelu regex101.com . Jeśli chcesz, możesz również obejrzeć w tym linku , jak to będzie się zgadzać z niektórymi przykładowymi danymi wejściowymi.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.