首页 文章

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

提问于
浏览
0

我在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

有没有办法在Python 3中使用单个正则表达式并且没有其他过程代码?感觉应该有一个更优雅的方式,但我还没有看到它(还) .

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

请注意,RegEx-Replace可能只匹配整个单词而不是部分单词 . 我的文字中的第五个单词是“some”,这导致第一个单词(“Some”)第一个字母被转换为小写,但留下单词“Something”,第二个单词开头,未触及 .

1 回答

  • 1

    你不能用 re module 这样做,因为它不支持可变长度的lookbehind,因为当你使用像 (?i) 这样的内联修饰符时,它会为所有模式设置,你不能将其关闭 . 可以使用此模式使用新的regex module来执行此操作:

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

    但是,我不确定这是一种更“优雅”的方式 .

    可以使用regexstorm.net/tester测试模式(因为.net正则表达式引擎也允许可变长度的后视图 . )

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

相关问题