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,则分割次数没有限制(进行所有可能的分割)。
| 归档时间: |
|
| 查看次数: |
51446 次 |
| 最近记录: |