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?
答案 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}}
答案 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)
在这种情况下,我建议partition
或split
;当没有圆点时,它们运作良好。
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)