Zastanawiałem się, co jest najlepszym sposobem, aby dopasować "test.this"
ze "blah blah blah test.this@gmail.com blah blah"
jest? Korzystanie z Pythona.
próbowałem re.split(r"\b\w.\w@")
Zastanawiałem się, co jest najlepszym sposobem, aby dopasować "test.this"
ze "blah blah blah test.this@gmail.com blah blah"
jest? Korzystanie z Pythona.
próbowałem re.split(r"\b\w.\w@")
Odpowiedzi:
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 \w
dopasować jeden lub więcej znaków słownych.
Teraz, jeśli chcesz test.this
treści, split
to nie jest to, czego potrzebujesz. split
podzieli 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']
„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'
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.
To wyrażenie,
(?<=\s|^)[^.\s]+\.[^.\s]+(?=@)
może również działać poprawnie dla tych określonych typów ciągów wejściowych.
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)
['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.
\w
pasuje tylko do jednej postaci - prawdopodobnie chcesz\w+