所以本质上,我要问的是,是否有一种方法可以将句子中的所有双字母(aa、bb、cc、dd 等)替换为同一个单词,如“science”,而无需制作字典带有所有双字母并且必须替换它们。是否有使用正则表达式的一行代码可以在 Python 中实现这一点?
如果没有,我想我将有另外 26 行代码来执行此操作,哈哈。
单线,按要求:
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])
。
根本不需要使用字典,只需匹配双倍的字母:
>>> 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'
,它更能自我记录。