find = re.compile("^(.*)\..*")
for l in lines:
m = re.match(find, l)
print m.group(1)
Run Code Online (Sandbox Code Playgroud)
我希望在字符串中使用正则表达式直到第一个点.
在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?
Roh*_*ain 41
默认情况下,所有量词都是贪婪的.从某种意义上说,他们会尽量消耗尽可能多的字符串.你可以通过追加它们来使它们不情愿?
:
find = re.compile(r"^(.*?)\..*")
Run Code Online (Sandbox Code Playgroud)
如评论中所述,如果字符串中没有句点,则此方法将失败.所以,这取决于你希望它的表现方式.但是如果你想在这种情况下得到完整的字符串,那么你可以使用一个否定的字符类:
find = re.compile(r"^([^.]*).*")
Run Code Online (Sandbox Code Playgroud)
它会在遇到第一个句点后或字符串的结尾处自动停止.
你也不想使用re.match()
那里.回覆.search()
应该没问题.您可以将代码修改为:
find = re.compile(r"^[^.]*")
for l in lines:
print re.search(find, l).group(0)
Run Code Online (Sandbox Code Playgroud)
Jer*_*rry 32
.find()
在这种情况下,您可以使用而不是正则表达式:
>>> s = "a@b.c"
>>> print(s[0:s.find('.')])
a@b
Run Code Online (Sandbox Code Playgroud)
考虑到这些注释,这里有一些修改使用.index()
(它类似于.find()
除了当没有匹配的字符串而不是-1时它返回错误):
>>> s = "a@b.c"
>>> try:
... index = s.index('.')
... except ValueError:
... index = len(s)
...
>>> print(s[:index])
a@b
Run Code Online (Sandbox Code Playgroud)
您可以使用以下split
方法:在字符处拆分字符串.
一次,您将得到一个元组(在第一个句点之前,在第一个句点之后)。符号是:
mystring.split(".", 1)
Run Code Online (Sandbox Code Playgroud)
然后你可以简单地创建一个生成器来“产生”你感兴趣的部分,并忽略你不感兴趣的部分(_
符号)。它的工作原理如下:
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
Run Code Online (Sandbox Code Playgroud)
输出:
a@b
a@b
a@b
Run Code Online (Sandbox Code Playgroud)
该split
方法的文档可以在网上找到:
str.split([sep[, maxsplit]])
返回字符串中单词的列表,
sep
用作分隔符字符串。如果maxsplit
给出,则最多进行maxsplit
拆分(因此,列表最多maxsplit+1
包含元素)。如果maxsplit
未指定或 -1,则分割次数没有限制(进行所有可能的分割)。