【问题标题】:Replace all a in the middle of string by * using regex使用正则表达式将字符串中间的所有a替换为*
【发布时间】:2017-09-03 16:52:05
【问题描述】:

我想在 python 中使用正则表达式将字符串中间的所有 'A' 替换为 '*' 我试过这个

re.sub(r'[B-Z]+([A]+)[B-Z]+', r'*', 'JAYANTA ')

但它输出 - '*ANTA'

我希望它是“J*Y*NTA”

有人可以提供所需的代码吗?如果可能的话,我想解释一下我的代码有什么问题。

【问题讨论】:

  • 在字符串或单词的中间?如果是一个词,请使用r'\BA\B'

标签: python regex replace


【解决方案1】:

使用非字边界\B
确保 A 被单词字符包围:

import re
str = 'JAYANTA POKED AGASTYA WITH BAAAAMBOO '
str = re.sub(r'\BA+\B', r'*', str)
print(str)

打印:

J*Y*NTA POKED AG*STYA WITH B*MBOO 

或者,如果您想更具体,它必须用大写字母包围。您可以改用lookbehind 和lookahead。

str = re.sub(r'(?<=[A-Z])A+(?=[A-Z])', r'*', str)

【讨论】:

  • 这是因为您的代码还将 A 周围的字符纳入匹配项。从而取代了那些一无所有。这就是环视很方便的地方,因为它们不会包含在匹配中,它只是检查它是否存在。
  • 您的正则表达式给出 '*ANTA' 作为输出的原因是因为在将 'JAY' 替换为 * 之后没有其他匹配项。
【解决方案2】:
>>> re.sub(r'(?!^)[Aa](?!$)','*','JAYANTA')
'J*Y*NTA'

我的正则表达式搜索 A,但它不能位于字符串的开头 (?!^) 而不是字符串的结尾 (?!$)。

【讨论】:

  • 替换字符串中的所有As,而不是字符串的开头或结尾:我想替换字符串中间的所有'A' by ''*
  • 字符串末尾有空格。在这种情况下,您的正则表达式会替换最后一个 A。
【解决方案3】:

前瞻断言:

>>> re.sub(r'A(?=[A-Z])', r'*', 'JAYANTA ')
'J*Y*NTA '

如果单词以'A'开头和结尾:

>>> re.sub(r'(?<=[A-Z])A(?=[A-Z])', r'*', 'AJAYANTA ')
'AJ*Y*NTA '

【讨论】:

  • 很好的解决方案,但如果 A 位于字符串中的索引 0 处,则会裁剪它。
  • @Mr.Xcoder 对于这种情况,您需要检查双方&gt;&gt;&gt; re.sub(r'(?&lt;=[A-Z])A(?=[A-Z])', r'*', 'AJAYANTA ') 'AJ*Y*NTA '
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
相关资源
最近更新 更多