Python中句子的大写

时间:2013-11-05 09:22:56

标签: python

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

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

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. 每个时期后的大写,问号或感叹号
  4. 如果信件之后有一段时间并且之前没有字母
  5. ,则将该字母大写

    到目前为止我只有

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

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

    大写第一个字母大写,然后通过字符串,如果有句号,问号或感叹号,那么下一个字母将被大写。如果在一段时间之前有一封信,在一段时间之前有两个字符,则在该期间之前将该字母大写。

3 个答案:

答案 0 :(得分:4)

以下代码符合您的3条规则。但我认为你的规则并不完整。 'is'中的字符'i'与规则2匹配,但不应将其设置为captialized。

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. 

答案 1 :(得分:2)

这是对Timothy Zhang的回答的改进,正确处理了几个案例。请参阅内联注释。也就是说,处理大写中的所有异常和奇怪是一个相当复杂的语言问题。使用预制解决方案(有人建议使用Python自然语言工具包,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)
  

嘿。你好吗? C.I.A.正在看!洛尔。

答案 2 :(得分:1)

它并不像看起来那么简单,但是假设你只是在寻找一个简单的解决方案,在简单的情况下工作(否则,你需要像NLTK那样复杂得多的东西。)

在最简单的情况下,你需要的是确定哪个字母要大写,提取它们然后将它们大写并注入它们。

有几种方法可以做到这一点,但大多数方法都会使用字母位置和标点符号作为识别因素。

尝试使用循环,替换,正则表达式,并通过编辑问题发布结果。