Подтвердить что ты не робот

Регулярное выражение 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?

4b9b3361

Ответ 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]