【问题标题】:Replace consecutive substring in string替换字符串中的连续子字符串
【发布时间】:2020-09-21 13:19:14
【问题描述】:

我有一个字符串,其中一个模式可以连续重复。我的目标是用一个替换上述模式的一个或多个连续出现。

例如。如果字符串是“BREAKBREAKBREAKword1BREAKword2 word3 BREAKBREAKBREAKBREAKBREAK word4BREAK word5”并且模式是“BREAK”。 最终输出应该是“BREAKword1BREAKword2 word3 BREAK word4BREAK word5”

有人可以帮我在 python 中实现这一点吗?当模式是字符时,我能够实现这一点,但当它是字符串时则不行。另外,我不想使用 for 循环来实现这一点。我正在寻找正则表达式解决方案。

我的正则表达式是

re.sub("BREAK{2,}", "BREAK", string). 

这在 BREAK 只是一个字符而不是字符串时有效。

【问题讨论】:

  • 请包含您想出的正则表达式,然后我们可以帮助您更正它
  • 谢谢@DanielFarrell。我正在尝试这样的 re.sub("BREAK{2,}", "BREAK", string)。
  • 只需使用re.sub("(BREAK){2,}", "BREAK", string)。使用括号
  • result = re.sub("(?:BREAK)+", "BREAK", subject)

标签: python-3.x regex string


【解决方案1】:

诸如{2,} 之类的正则表达式量词量化了它们直接跟随的表达式。 BREAK{2,} 匹配文字 BREA 后跟 2 个或更多 Ks。

>>> print(re.match('BREAK{2,}', 'BREAK'))
None
>>> print(re.match('BREAK{2,}', 'BREAKKK'))
<_sre.SRE_Match object at 0x1076a2d98>

您在这里缺少的是分组括号。将正则表达式的一部分括在括号中该部分正则表达式一起用于后续量词,例如 *+?{2,}

括号还将文本捕获到您可以包含在替换中的编号变量中。您还可以命名捕获组,甚至将它们标记为非捕获组。但这在这里并不重要——仅仅因为你最终有一个捕获组,并不意味着你必须使用它。

>>> print(re.sub("(BREAK){2,}", "BREAK", "BREAKBREAKBREAKBREAK"))
BREAK

【讨论】:

  • 谢谢!这可能是一个愚蠢的问题,但你是如何将背景转换为灰色的?你能告诉我吗?
【解决方案2】:

这会替换多次出现的“BREAK”:

subject = 'BREAKBREAKBREAKword1BREAKword2 word3 BREAKBREAKBREAKBREAKBREAK word4BREAK word5'
result = re.sub('(?:BREAK)+', 'BREAK', subject)

这是因为(?:&lt;expression&gt;)+ 是一个非捕获组,由于+ 而匹配&lt;expression&gt; 一次或多次。

【讨论】:

    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 2012-04-03
    • 2013-07-23
    • 2016-11-28
    相关资源
    最近更新 更多