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

时间:2014-07-01 17:26:17

标签: regex python-3.x

我在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可能只匹配整个单词而不是部分单词。我的文字中的第5个字是&#34;有些&#34;这会导致第一个单词的第一个单词被转换为小写,但是留下单词“#34; Something&#34;”,第二个单词以“未触动”开头。< / p>

1 个答案:

答案 0 :(得分: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.+))

然而,我不确定这是一个更优雅的&#34;方式。

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

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