Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换子字符串的正则表达式(如果不是单词的开头)_Python_Regex_Replace - Fatal编程技术网

Python 替换子字符串的正则表达式(如果不是单词的开头)

Python 替换子字符串的正则表达式(如果不是单词的开头),python,regex,replace,Python,Regex,Replace,我正在处理类似于@Alice@home的推文。我想将用户提及的内容转换为普通单词(例如,@Alice=>Alice),但将个人@作为的替代词保留在。因此,简单地替换所有出现的@是行不通的 我发现了单词边界的概念,但我还没能让它们起作用。首先 print re.sub(r'\b@\b', '', '@Alice @ home') 不会改变任何事情,而 print re.sub(r'\bAlice\b', '', '@Alice @ home') 结果显示在@@home。所以我假设at符号(@)

我正在处理类似于
@Alice@home
的推文。我想将用户提及的内容转换为普通单词(例如,
@Alice=>Alice
),但将个人
@
作为
的替代词保留在
。因此,简单地替换所有出现的
@
是行不通的

我发现了单词边界的概念,但我还没能让它们起作用。首先

print re.sub(r'\b@\b', '', '@Alice @ home')
不会改变任何事情,而

print re.sub(r'\bAlice\b', '', '@Alice @ home')
结果显示在
@@home
。所以我假设at符号(
@
)不算作单词的一部分

简而言之,我基本上是在寻找
模式
,以便

print re.sub(pattern, '', '@Alice @ home')
输出
Alice@home


谢谢你的提示。

你可以玩边界
\B
\B

>>> print re.sub(r'\B@\b', r'', '@Alice @ home')
Alice @ home
>>> print re.sub(r'\B@\b', r'', 'foo @Alice @ home')
foo Alice @ home

\B
两个单词字符之间或两个非单词字符之间的匹配。因此,上述正则表达式中的
\B@
Alice
之前的
@
和另一个单独的
@
符号匹配
\b
匹配单词字符和非单词字符(反之亦然)。因此,下面的
\b
使模式仅与第一个匹配,因为第一个
@
本身后跟一个单词字符,即
a

对我来说最简单的方法是:

>>> s = '@Alice @ home'
>>> re.sub('\s@\s', ' at ', s).replace('@', '')
'Alice at home'
初步答复 请尝试以下正则表达式:

@(?! )
以下是它如何执行的几个示例:

>>> print re.sub(r'@(?! )', '', '@Alice @ home')
Alice @ home
>>> print re.sub(r'@(?! )', '', 'Whatever @Alice @ home')
Whatever Alice @ home
>>> 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' @?
您还可以使用进行测试

要点:

  • @
    –at标志
  • (?!)
    –与空格以外的任何内容相匹配的负前视(即后面不跟空格)
就我个人而言,我觉得零宽度单词边界断言(
\b
\b
)有点分散注意力,我更喜欢用于这类事情,但是TMTOWTDI

正面 我对此进行了更多的思考(和往常一样),我发现零宽度单词边界断言的简单性以及字符串的开始和结束匹配是一个令人信服的例子

考虑一组更完整的推文:

@Alice @ home
Whatever @Alice @ home
What're you lookin' @
What're you lookin' @?
事实证明,要正确处理这些问题,需要更复杂的消极前瞻,将我最初的正则表达式转换为:

@(?![ \W]|$)
如前所述,以下是其执行方式的示例:

>>> print re.sub(r'@(?! )', '', '@Alice @ home')
Alice @ home
>>> print re.sub(r'@(?! )', '', 'Whatever @Alice @ home')
Whatever Alice @ home
>>> 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' @?
和以前一样,您也可以使用

但是,像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' @?
如果你也喜欢的话,可以试试看


总之,对于我来说,这是一次很酷的学习经历,可以让我质疑我更喜欢使用什么,我希望你也能找到同样的体验:继续我们的单词边界断言冒险!:)

回答得很好。我在回答中把它的票数提高了。谢谢