0

所以本质上,我要问的是,是否有一种方法可以将句子中的所有双字母(aa、bb、cc、dd 等)替换为同一个单词,如“science”,而无需制作字典带有所有双字母并且必须替换它们。是否有使用正则表达式的一行代码可以在 Python 中实现这一点?

如果没有,我想我将有另外 26 行代码来执行此操作,哈哈。

4

2 回答 2

4

单线,按要求:

re.sub(r'([a-z])\1', 'science', inputString)

如果你想AA被替换,但不是aA

re.sub(r'([a-zA-Z])\1', 'science', inputString)

如果要替换AA,请aA指定不区分大小写的标志re.I

re.sub(r'([a-z])\1', 'science', inputString, flags = re.I)

请注意,不区分大小写标志也会导致反向引用进行不区分大小写的比较。

解释

我建议您[]在阅读本说明之前阅读文档并掌握正则表达式的基本知识,尤其是字符类。

(...), 后面的第一个字符不是(捕获。嗯,是这个规则的一个例外,它也是一个捕获组,但是你可以给它一个名字,所以它被称为命名捕获组。捕获组将记录与内部模式匹配的部分文本,以便您稍后可以引用它们(在正则表达式或替换字符串中)。?(?P<name>..)

反向引用\number,其中number为正数,用于检查当前文本是否与捕获组匹配的文本相同。(对于命名的捕获组,您将使用(?P=name)相同的功能但不同的语法)。

([a-z])\1个例子。它捕获一个英文字母[a-z](注意()它的周围)。紧接着,\1将检查下一个字符(或字符序列,在一般情况下)是否与捕获组匹配的字符相同([a-z])

于 2013-03-02T14:53:28.370 回答
3

根本不需要使用字典,只需匹配双倍的字母:

>>> import re
>>> re.sub(r'(?P<letter>[a-z])(?P=letter)', 'science', 'some aa doubled dd letters')
'some science doubled science lescienceers'

(?P<name>..)组由(?P=letter)匹配引用,因此仅匹配双倍的字母。这是一种更详细的使用方式r'([a-z])\1',它更能自我记录。

于 2013-03-02T14:54:41.563 回答