使用python以最佳速度仅删除word中的双字母序列
查找/替换字符串中的双字母的非常流行的任务。但存在一个解决方案,您可以通过几个步骤来删除双字母。例如,我们有字符串使用python以最佳速度仅删除word中的双字母序列,python,regex,string,Python,Regex,String,查找/替换字符串中的双字母的非常流行的任务。但存在一个解决方案,您可以通过几个步骤来删除双字母。例如,我们有字符串“skalallapenndraaa”,在替换了双字母之后,我们需要进入输出“skalpendra”。我试着解决这个问题 re.sub(r'([a-z])\1+', r'\1', "skalallapennndraaa") ,但这不会删除字符串中的所有双字母(结果-“skalalapendra”)。如果我使用r'作为第二个参数,我得到了一个密切相关的结果“skalaapendr”,
“skalallapenndraaa”
,在替换了双字母之后,我们需要进入输出“skalpendra”
。我试着解决这个问题
re.sub(r'([a-z])\1+', r'\1', "skalallapennndraaa")
,但这不会删除字符串中的所有双字母(结果-
“skalalapendra”
)。如果我使用r'
作为第二个参数,我得到了一个密切相关的结果“skalaapendr”
,但我仍然找不到替换参数的正确正则表达式。有什么想法吗?您可以使用此双重替换:
>>> s = 'skalallapennndraaa'
>>> print re.sub(r'([a-z])\1', '', re.sub(r'([a-z])([a-z])\2\1', '', s))
skalpendra
([a-z])([a-z])\2\1
将删除所有类型的案例,而([a-z])\1
将删除剩余的双字母
更新:根据下面的评论,我意识到基于循环的方法是最好的。这是:
>>> s = 'nballabnz'
>>> while re.search(r'([a-z])\1', s):
... s = re.sub(r'([a-z])\1', '', s)
...
>>> print s
z
您可以使用此双重替换:
>>> s = 'skalallapennndraaa'
>>> print re.sub(r'([a-z])\1', '', re.sub(r'([a-z])([a-z])\2\1', '', s))
skalpendra
([a-z])([a-z])\2\1
将删除所有类型的案例,而([a-z])\1
将删除剩余的双字母
更新:根据下面的评论,我意识到基于循环的方法是最好的。这是:
>>> s = 'nballabnz'
>>> while re.search(r'([a-z])\1', s):
... s = re.sub(r'([a-z])\1', '', s)
...
>>> print s
z
您需要多次运行正则表达式,直到不替换任何内容为止。替换参数中存在问题,因为在需要删除双字母的地方,r'\1'会留下一个字母,但我需要同时删除两个(且仅删除2个)字母,不是3或任何其他数字。您需要多次运行正则表达式,直到不替换任何内容为止。替换参数中存在问题,因为在需要删除双字母的位置,r'\1'会留下1个字母,但我需要同时删除两个(且仅删除2个)字母,而不是3或任何其他数字。在替换双字母后,我们需要进入输出“斯卡拉潘德拉“。您有
skalpendra
作为输出。似乎正是我需要的。非常感谢。这是我在描述中的错误,输出是正确的。适用于该示例,但一般情况下,您需要继续应用正则表达式,直到结果停止更改,而不仅仅是两个周期。@anubhava-这一点很好!你必须走得相当远。。。比如“nballabn”。在替换了双字母之后,我们需要输入输出“skalapendra”。您有skalpendra
作为输出。这似乎正是我需要的。非常感谢。这是我在描述中的错误,输出是正确的。适用于该示例,但一般情况下,您需要继续应用正则表达式,直到结果停止更改,而不仅仅是两个周期。@anubhava-这一点很好!你必须走得相当远。。。像“nballabn”。