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
prints a@b.c.d
prints a@b.c.d.e
prints a@b
a@b.c
prints a@b.c.d
应该找到什么才能让它只得到一个@b?
发布于 2013-10-03 00:33:28
默认情况下,所有的量词本质上都是贪婪的。从这个意义上说,他们会尽可能多地使用字符串。您可以通过在它们后面附加一个?
来使它们不情愿:
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)
发布于 2013-10-03 00:39:45
发布于 2013-10-03 00:51:53
您可以使用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
可以在online中找到split
方法的文档
str.split([sep[, maxsplit]])
返回字符串中的单词列表,使用sep
作为分隔符字符串。如果给定maxsplit
,则至多完成maxsplit
拆分(因此,列表将至多包含maxsplit+1
元素)。如果未指定maxsplit
或-1,则对拆分的数量没有限制(进行所有可能的拆分)。
https://stackoverflow.com/questions/19142042
复制相似问题