Python正则表达式:从字符串中删除电子邮件

9

需要在字符串中替换电子邮件,因此:

inp = 'abc user@xxx.com 123 any@www foo @ bar 78@ppp @5555 aa@111"

应该得到的结果是:
out = 'abc 123 foo bar"

应该使用什么正则表达式?

In [148]: e = '[^\@]\@[^\@]'
In [149]: pattern = re.compile(e)
In [150]: pattern.sub('', s)  
Out[150]: 'one aom 123 4two'
In [151]: s
Out[151]: 'one ab@com 123 4 @ two'

无法为我工作

我建议在空白处拆分字符串,删除包含@的数组元素并合并字符串。但这不是正则表达式。 - fonfonx
可能是重复的问题:使用正则表达式验证电子邮件地址 - logi-kal
@fonfonx 是的,我也在考虑拆分、删除和合并回来。但对我来说似乎有些过度了。 - dokondr
实际上,问题中的示例是错误的,任何形如@www、78@ppp或@5555的内容都不是有效的电子邮件地址,因此它们不应该被删除。 - Alok Prasad
4个回答

22

替换:
\S*@\S*\s?
为 ''

点此查看演示

解释:
\S*:尽可能匹配多个非空字符
@:然后是一个 @ 符号
\S*:接着是另一个非空字符序列
\s?:最后是一个空格(如果有的话)。请注意,'?' 必须用来匹配行末的地址。由于 '?' 的贪婪性,如果存在空格,它将始终被匹配。


我的错误,它现在可以工作了,谢谢!为什么需要尾随的 '\s?'? - dokondr
1
@dokondr:如果你只使用\S*@\S*,那么如果在它们之间删除了一个地址,剩下的单词将被分开超过一个空格。通过添加\s?,每次你删除一个地址时,你将会连同一个空格一起删除。 - Gawil
我已经添加了解释。如果您有任何不理解的地方,请告诉我。 - Gawil

3

由于没有人添加正则表达式,因此需要进行添加:

text= 'abc user@xxx.com 123 any@www foo @ bar 78@ppp @5555 aa@111'

required_output=re.sub(r'[A-Za-z0-9]*@[A-Za-z]*\.?[A-Za-z0-9]*', "", text)
    
required_output=" ".join(required_output.split())

3

我个人更喜欢自己进行字符串解析。让我们尝试分割字符串,并且去除掉包含@符号的部分:

inp = 'abc user@xxx.com 123 any@www foo @ bar 78@ppp @5555 aa@111'
items = inp.split()

现在我们可以这样做:
>>> [i for i in items if '@' not in i]
['abc', '123', 'foo', 'bar']

这让我们接近了目标。让我们再稍微修改一下来添加一个 join :

>>> ' '.join([i for i in inp.split() if '@' not in i])
'abc 123 foo bar'

它可能不是正则表达式,但它适用于您提供的输入。

实际上,问题中的示例是错误的,任何形如@www、78@ppp或@5555的内容都不是有效的电子邮件地址,因此它们应该被删除。 - Alok Prasad

1
out = ' '.join([item for item in inp.split() if '@' not in item])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接