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

我想对字符串中的任何内容进行正则表达式,直到第一个点。

a@b.c我要进去我要a@b
进去 我要a@b.c.da@b
a@b.c.d.ea@b

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

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

应该找到什么以便它只得到 a@b?

4

5 回答 5

60

默认情况下,所有量词本质上都是贪婪的。从某种意义上说,他们将尝试尽可能多地消耗字符串。您可以通过在它们后面附加 a 来使它们不情愿?

find = re.compile(r"^(.*?)\..*")

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

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

它会在遇到第一个句点后自动停止,或者在字符串的末尾。


你也不想使用re. match()那里。关于。search()应该没问题。您可以将代码修改为:

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

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

ideone 上的演示

于 2013-10-02T16:33:28.250 回答
41

.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
于 2013-10-02T16:39:44.597 回答
6

可以使用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方法的文档可以在网上找到:

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

返回字符串中的单词列表,sep用作分隔符字符串。如果maxsplit给出,最多 maxsplit拆分完成(因此,列表最多有maxsplit+1 元素)。如果maxsplit未指定或 -1,则拆分次数没有限制(进行所有可能的拆分)。

于 2013-10-02T16:51:53.207 回答
2

我推荐partitionorsplit在这种情况下;当没有点时它们工作得很好。

text = "example@example.com"

print text.partition(".")[0]
print text.split(".", 1)[0]
于 2013-10-02T16:51:34.457 回答
1
import re
data='a@b.c.d.e'
re.sub('\..*','',data)
于 2013-10-02T16:59:12.927 回答