如何对每个匹配事件进行大写?每两个字母组合,第一个上部,第二个下部,它们被一个空格或字符串的开头/结尾包围。
re.sub('( |^)[A-Z][a-z]($| )', lambda m: m.group(0).upper(), loc)
与
一起使用loc = ' Ny' # or ' Ny ' or 'Ny '
但不是
loc = ' Ny Us'
我希望结果为NY
和NY US
我正在使用Python 2.7。
答案 0 :(得分:4)
您可以将最后一组转换为前瞻:
re.sub('( |^)[A-Z][a-z](?=$| )', lambda m: m.group(0).upper(), loc)
^^^^^^^
请参阅Python demo。
重点是允许正则表达式引擎匹配上一次迭代匹配的最后一个字母后的空格。
以下是基于可用于同一任务的外观的替代正则表达式:
r'(?<!\S)[A-Z][a-z](?!\S)'
见this regex demo。 (?<!\S)
负向后视需要字符串开头的位置或前面带有空格的位置。 (?!\S)
否定前瞻需要字符串位置的结束或紧靠当前位置右侧的空格。