Python 如何使用;查找“;在字符串搜索中,找到搜索结果左侧的起始位置

Python 如何使用;查找“;在字符串搜索中,找到搜索结果左侧的起始位置,python,python-3.x,string,find,Python,Python 3.x,String,Find,请原谅我可能发布了最愚蠢的问题,但是Python新手在这里。我在regex一章,从文件中提取电子邮件地址似乎很容易。问题是,我还不明白如何使用“普通”代码来实现这一点。我可以使用查找找到“@”的位置,然后通过查找“@”后的下一个空格找到电子邮件地址的结尾。但如何将搜索移到“@”的“左侧”?找不到 这可能是最简单的事情,但我已经搜索了这么多网站,现在我放弃了,并在这里创建了一个帐户。我想如果我是负数的话,我可能会向左移动,但我错了。如果有人能帮我打开灯泡,我将不胜感激。非常感谢 例如: data=

请原谅我可能发布了最愚蠢的问题,但是Python新手在这里。我在regex一章,从文件中提取电子邮件地址似乎很容易。问题是,我还不明白如何使用“普通”代码来实现这一点。我可以使用查找找到“@”的位置,然后通过查找“@”后的下一个空格找到电子邮件地址的结尾。但如何将搜索移到“@”的“左侧”?找不到

这可能是最简单的事情,但我已经搜索了这么多网站,现在我放弃了,并在这里创建了一个帐户。我想如果我是负数的话,我可能会向左移动,但我错了。如果有人能帮我打开灯泡,我将不胜感激。非常感谢

例如:

data=“来自随机文本myemail@gmail.com星期六21:19“
atpos=data.find(“@”)
结束=数据。查找(“,atpos)
开始=数据。查找(“,***???**,***???**”)
地址=数据[开始:结束]
打印(地址)

您可以将字符串按空格分割,然后为每个单词检查是否有
@
字符串。如果是这样的话,您可以将单词按
@
字符串进行拆分,以获得左右部分

data=“来自随机文本myemail@gmail.com星期六21:19“
对于data.split()中的文本:
如果文本中有“@”:
left,right=text.split(“@”)
打印(f'电子邮件以“{left}”开头,位于域“{right}”中)
输出

The email starts with "myemail" and is in the domain "gmail.com"
myemail@gmail.com
更新

如果你真的想用索引位置来做这件事,然后找到。然后,您已经知道如何查找
@
的位置,并且知道如何通过指定起始索引来搜索
@
后面的第一个空格

find的文档指定它查找最低的索引。但是,我们可以使用
rfind
查找最高索引,即字符串中的最后一个事件

string.find(s,sub[,start[,end]])返回s中的最低索引,其中 找到子字符串sub时,sub完全包含在 s[开始:结束]。失败时返回-1。开始、结束和结束的默认值 负值的解释与切片的解释相同

string.rfind(s,sub[,start[,end]])与find()类似,但查找最高的 索引

因此,使用rfind可以找到字符串中最后一个空格实例。如果我们将0作为开始传递(因此从开头开始),然后将
@
的索引作为结束传递,那么它将找到字符串开头和
@
符号之间最后一个空格字符的索引。然后我们想要加1,因为我们不想要空间的索引,而是后面的索引

data=“来自随机文本myemail@gmail.com星期六21:19“
#获取@
at_index=data.find(“@”)
#获取后开始的第一个空间索引@
右索引=data.find(“”,在索引处)
#从开始获取空间的最后一个索引,但不超过@
左索引=data.rfind(“”,0,在索引处)+1
打印(数据[左索引:右索引])
输出

The email starts with "myemail" and is in the domain "gmail.com"
myemail@gmail.com

您可以稍后通过使用“@”符号拆分此循环结果来提取电子邮件域和名称

最好明确您希望实现的目标。因此,样本输入和预期输出。人们可以帮助解释您当前代码中的问题,但也可能会提出另一种方法试图理解.find的基础知识。似乎使用.find可以找到类似@的位置,然后根据第一个值找到右侧的另一个位置。找不到搜索结果左侧的位置。我在示例中的目标是切掉完整的电子邮件地址非常感谢。比我到目前为止所学的要高级一点,到目前为止,我只从字典里知道这些。看起来您可以使用它们在上面的循环中调用它们。只是想了解的基本知识。现在就查找。似乎使用.find可以找到类似@的位置,然后根据第一个值找到右侧的另一个位置。找不到搜索结果左侧的位置。在这个例子中,我的目标是切掉完整的电子邮件地址。print语句中的
{}
是pythons f-string的语法,您可以了解它以及如何使用它。它只允许您在字符串中声明变量。如果你只是想要整封邮件,那么在for循环中,只需在text:print(text)中执行
if'@'即可。我已经更新了y答案,解释了如何使用find和rfind对索引位置执行此操作。这真的很有帮助,现在就打开了新的途径。还有很多东西需要从基础上学习。非常感谢你花了这么多时间和细节来帮助我理解。谢谢你,这很有帮助!我认为我使用的是find-error,期望它找到一个匹配项,或者某个东西是否包含某个东西,但实际上只是得到某个东西的位置。你的“如果……在”真的是实现这一目标的正确方法。再次感谢,吸取的教训:)