2

我正在修改一个简单的代码,但我似乎无法理解它。

我希望用户以句子的形式在提示中输入一个字符串。例如:

hey. how are you? the c.i.a. is watching! lol. 

它返回:

Hey. How are you? The C.I.A. Is watching! Lol.

所以它的要求是:

  1. 如果是字母,则将字符串的第一个大写
  2. 每个句号、问号或感叹号后大写
  3. 如果字母后面有句号且前面没有字母,则将字母大写

到目前为止我只有

def fix_capitalization():
s = raw_input("Enter string: ")
if s[0:1] == 'a' < [char] < 'z': 
    capitalize(s)

关于我将如何做到这一点的思考过程如下

Capitalize(s) 将第一个字母大写,然后遍历字符串,如果有句号、问号或感叹号,则下一个字母将大写。如果句点前有一个字母,句点前有两个字符,则句点前的字母大写。

4

3 回答 3

6

下面的代码符合您的 3 条规则。但我认为你的规则并不完整。'is' 中的字符 'i' 符合规则 2,但不应大写。

import re

def uppercase(matchobj):
    return matchobj.group(0).upper()

def capitalize(s):
    return re.sub('^([a-z])|[\.|\?|\!]\s*([a-z])|\s+([a-z])(?=\.)', uppercase, s)

s = """hey. how are you? the c.i.a. is watching! lol. """
print capitalize(s)

输出:

Hey. How are you? The C.I.A. Is watching! Lol. 
于 2013-11-05T09:45:29.893 回答
3

这是对 Timothy Zhang 答案的改进,正确处理了更多案例。请参阅内联注释。也就是说,处理大写中的所有异常和怪异是一个非常复杂的语言问题。使用预制解决方案(有人建议使用 Python Natural Language Toolkit,NLTK)或完全避免这个问题可能会更好。

import re

s1 = "hey. how are you? the c.i.a. is watching! lol."

print re.sub(r"(\A\w)|"+                  # start of string
             "(?<!\.\w)([\.?!] )\w|"+     # after a ?/!/. and a space, 
                                          # but not after an acronym
             "\w(?:\.\w)|"+               # start/middle of acronym
             "(?<=\w\.)\w",               # end of acronym
             lambda x: x.group().upper(), 
             s1)

嘿。你好吗?中央情报局在看!哈哈。

于 2013-11-05T10:28:01.983 回答
1
于 2013-11-05T09:45:27.637 回答