提问者:小点点

如何更改大小写从上到下的单词第一个字母,如果相同的单词出现至少一次在小写仅使用正则表达式


我在Python 3中创建了以下RegEx,以查找文本中的所有小写单词,并返回引用该单词的第一个字母和尾部。示例:

w          ord
^          ^^^
|          |
1st letter tail

之后,我使用for循环将所有匹配项替换为转换为大写的第一组,并将未更改的尾部替换为小写的第一个字母,后跟未更改的尾部。

str = "Some text here and some more after that. Something that should remain untouched."
for match in re.finditer(r"\b([a-z])([a-z]+)\b", str):
    # print(match.group(1).upper() + match.group(2)) # just for debugging
    str = re.sub(r"\b" + match.group(1).upper() + match.group(2) + r"\b", match.group(1) + match.group(2), str)

print(str) #print the desired result

在Python3中,有没有一种方法可以使用一个正则表达式而不使用额外的过程代码来实现这一点?感觉应该有一种更优雅的方式,但我还没有看到。

为了完整性:如果代码应用于str中存储的字符串,则结果是:这里有一些文本,之后还有一些文本。应该保持不变的东西。

请注意,RegEx Replace只能匹配整个单词,不能匹配部分单词。我文本中的第五个单词是“some”,这会导致第一个单词(“some”)的第一个字母转换为小写,但保留单词“Something”,第二句以,未触及开头。


共1个答案

匿名用户

使用re模块无法做到这一点,因为它不支持可变长度查找,而且当您使用像(?i)这样的内联修饰符时,它是为所有模式设置的,您无法将其关闭。使用新的regex模块可以使用以下模式执行此操作:

\b([A-Z][a-z]*)\b(?:(?=.*\b(?=[a-z]+\b)(?i)\1\b)|(?<=\b(?=[a-z]+\b)(?i)\1\b.+))

然而,我不确定这是一种更“优雅”的方式。

可以用regexstorm.net/tester测试模式(因为. net正则表达式引擎也允许变长。)

请注意,内联修饰符的范围仅限于它后面的子模式,并在第一个结束括号处结束。