初步回答
试试下面的正则表达式:
@(?! )
这里有几个例子来说明它的表现:
>>> print re.sub(r'@(?! )', '', '@Alice @ home')
Alice @ home
>>> print re.sub(r'@(?! )', '', 'Whatever @Alice @ home')
Whatever Alice @ home
您也可以使用a related regex fiddle 进行测试。
关键点:
-
@ - at-sign
-
(?! ) – 否定前瞻,匹配除空格以外的任何内容(即后面没有空格)
我个人觉得零宽度字边界断言(\b 和 \B)有点分散注意力,我更喜欢使用 zero-width lookarounds 来处理这类事情,但 TMTOWTDI。
关于脸
我想了更多(像往常一样),我发现无疑是零宽度词边界断言的简单性和字符串开头和结尾匹配的一个令人信服的案例。
考虑一组更完整的推文:
@Alice @ home
Whatever @Alice @ home
What're you lookin' @
What're you lookin' @?
事实证明,要使这些正确,需要一个更复杂的负前瞻,将我最初的正则表达式变成:
@(?![ \W]|$)
和以前一样,下面是它的执行示例:
>>> print re.sub(r'@(?![ \W]|$)', '', '@Alice @ home')
Alice @ home
>>> print re.sub(r'@(?![ \W]|$)', '', 'Whatever @Alice @ home')
Whatever Alice @ home
>>> print re.sub(r'@(?![ \W]|$)', '', "What're you lookin' @")
What're you lookin' @
>>> print re.sub(r'@(?![ \W]|$)', '', "What're you lookin' @?")
What're you lookin' @?
和以前一样,您也可以使用a related regex fiddle 进行测试。
但是像 Avinash Raj 所采用的词边界模式可以让这组更完整的可想象的推文变得正确......而且宣传更少:
>>> print re.sub(r'\B@\b', '', '@Alice @ home')
Alice @ home
>>> print re.sub(r'\B@\b', '', 'Whatever @Alice @ home')
Whatever Alice @ home
>>> print re.sub(r'\B@\b', '', "What're you lookin' @")
What're you lookin' @
>>> print re.sub(r'\B@\b', '', "What're you lookin' @?")
What're you lookin' @?
如果您也喜欢,请使用 another related regex fiddle 进行测试。
归根结底,这对我来说是一次很酷的学习经历,我可以质疑我更喜欢使用什么,我希望你也发现它是一样的:继续我们的词边界断言冒险! :)