Регулярное выражение Python, чтобы получить все до первой точки в строке
find = re.compile("^(.*)\..*")
for l in lines:
m = re.match(find, l)
print m.group(1)
Я хочу регулярное выражение в строке до первой точки.
в [email protected]
, я хочу [email protected]
в [email protected]
, я хочу [email protected]
в [email protected]
, я хочу [email protected]
Что мой код дает мне...
что должно быть так, чтобы он получал только @b?
Ответы
Ответ 1
По умолчанию все кванторы являются жадными по своей природе. В этом смысле они будут пытаться потреблять столько строк, сколько могут. Вы можете сделать это неохотно, добавив ?
после них:
find = re.compile(r"^(.*?)\..*")
Как отмечено в комментарии, этот подход не сработает, если в строке нет периода. Таким образом, это зависит от того, как вы хотите, чтобы он себя вел. Но если вы хотите получить полную строку в этом случае, вы можете использовать отрицательный класс символов:
find = re.compile(r"^([^.]*).*")
он автоматически остановится после встречи с первым периодом или в конце строки.
Также вы не хотите использовать re. match()
. re. search()
должно быть прекрасно. Вы можете изменить свой код на:
find = re.compile(r"^[^.]*")
for l in lines:
print re.search(find, l).group(0)
Демо на идее
Ответ 2
В этой ситуации вы можете использовать .find()
вместо regex:
>>> s = "[email protected]"
>>> print(s[0:s.find('.')])
[email protected]
С учетом комментариев, здесь некоторые изменения с использованием .index()
(он похож на .find()
, за исключением того, что он возвращает ошибку, когда нет согласованной строки вместо -1 ):
>>> s = "[email protected]"
>>> try:
... index = s.index('.')
... except ValueError:
... index = len(s)
...
>>> print(s[:index])
[email protected]
Ответ 3
Вы можете использовать метод split
: разделите строку на символ .
один раз, и вы получите кортеж (до первого периода, после первого периода). Обозначения:
mystring.split(".", 1)
Затем вы можете просто создать генератор, который "дает" интересующую вас часть, и игнорирует тот, который вы не являетесь (обозначение _
). Он работает следующим образом:
entries = [
"[email protected]",
"[email protected]",
"[email protected]",
]
for token, _ in (entry.split(".", 1) for entry in entries):
print token
Вывод:
[email protected]
[email protected]
[email protected]
Документацию по методу split
можно найти онлайн:
str.split([sep[, maxsplit]])
Возвращает список слов в строке, используя sep
как строку разделителя. Если maxsplit
задано, самое большее maxsplit
выполняются разбиения (таким образом, список будет иметь не более maxsplit+1
элементы). Если maxsplit
не задано или -1, тогда нет предела на количество расщеплений (все возможные расщепления сделаны).
Ответ 4
Я рекомендую partition
или split
в этом случае; они работают хорошо, когда нет точки.
text = "[email protected]"
print text.partition(".")[0]
print text.split(".", 1)[0]
Ответ 5
import re
data='[email protected]'
re.sub('\..*','',data)