Python正则表达式获取所有内容直到字符串中的第一个点

时间:2013-10-02 16:32:51

标签: python regex

find = re.compile("^(.*)\..*")
for l in lines:
    m = re.match(find, l)
    print m.group(1) 

我想在字符串中使用正则表达式,直到第一个点。

a@b.c

,我想要a@b
a@b.c.d中,我想要a@b
a@b.c.d.e中,我想要a@b

我的代码给了我什么......

  • a@b.c打印a@b
  • a@b.c.d打印a@b.c
  • a@b.c.d.e打印a@b.c.d

应该找到什么才能获得@ b?

5 个答案:

答案 0 :(得分:35)

默认情况下,所有量词都是贪婪的。从某种意义上说,他们会尽量消耗尽可能多的字符串。您可以通过在?后添加find = re.compile(r"^(.*?)\..*") 来使他们不情愿:

find = re.compile(r"^([^.]*).*")

如评论中所述,如果字符串中没有句号,则此方法将失败。所以,这取决于你希望它的表现方式。但是如果你想在这种情况下得到完整的字符串,那么你可以使用一个否定的字符类:

find = re.compile(r"^[^.]*")

for l in lines:
    print re.search(find, l).group(0)

它会在遇到第一个句号后或字符串末尾时自动停止。


此外,您不想在那里使用re.match()re.search()应该没问题。您可以将代码修改为:

{{1}}

Demo on ideone

答案 1 :(得分:30)

在这种情况下,您可以使用.find()代替正则表达式:

>>> s = "a@b.c"
>>> print(s[0:s.find('.')])
a@b

考虑到这些评论,这里使用.index()进行了一些修改(它类似于.find(),只是当没有匹配的字符串而不是-1时它返回错误):

>>> s = "a@b.c"
>>> try:
...     index = s.index('.')
... except ValueError:
...     index = len(s)
...
>>> print(s[:index])
a@b

答案 2 :(得分:4)

您可以使用split方法:将字符串拆分为.字符一次,您将获得一个元组(在第一个句点之后,第一个句点之后)。符号将是:

mystring.split(".", 1)

然后你可以简单地创建一个“产生”你感兴趣的部分的生成器,并忽略你不感兴趣的部分(_表示法)。它的工作原理如下:

entries = [
    "a@b.c",
    "a@b.c.d",
    "a@b.c.d.e",
    ]

for token, _ in (entry.split(".", 1) for entry in entries):
    print token

输出:

a@b
a@b
a@b

可以找到split方法的文档online

  

str.split([sep[, maxsplit]])

     

返回字符串中的单词列表,   使用sep作为分隔符字符串。如果给出maxsplit,则最多   已完成maxsplit拆分(因此,列表最多只有maxsplit+1   元件)。如果未指定maxsplit或-1,则没有限制   关于分裂的数量(所有可能的分裂)。

答案 3 :(得分:2)

在这种情况下,我建议partitionsplit;当没有圆点时,它们运作良好。

text = "example@example.com"

print text.partition(".")[0]
print text.split(".", 1)[0]

答案 4 :(得分:1)

import re
data='a@b.c.d.e'
re.sub('\..*','',data)