我在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 回答
你不能用
re module
这样做,因为它不支持可变长度的lookbehind,因为当你使用像(?i)
这样的内联修饰符时,它会为所有模式设置,你不能将其关闭 . 可以使用此模式使用新的regex module来执行此操作:但是,我不确定这是一种更“优雅”的方式 .
可以使用regexstorm.net/tester测试模式(因为.net正则表达式引擎也允许可变长度的后视图 . )
请注意,内联修饰符的范围仅限于其后的子模式,并在第一个右括号处结束 .