操作字符串,python

时间:2010-10-26 17:35:21

标签: python split tokenize

如何定义一个带字符串(句子)的函数,如果句点后面紧跟一个字母,则在一段时间后插入一个额外的空格。

sent = "This is a test.Start testing!"
def normal(sent):
    list_of_words = sent.split()
    ...

这应该打印出来

  

“这是一个测试。开始测试!”

我想我应该使用split()将字符串制成列表,但下一步是什么?

P.S。解决方案必须尽可能简单。

5 个答案:

答案 0 :(得分:8)

使用re.sub。您的正则表达式将匹配句点(\.)后跟一个字母([a-zA-Z])。您的替换字符串将包含对第二组(\ 2)的引用,这是正则表达式中匹配的字母。

>>> import re
>>> re.sub(r'\.([a-zA-Z])', r'. \1', 'This is a test.This is a test. 4.5 balloons.')
'This is a test. This is a test. 4.5 balloons'

请注意正则表达式选择[a-zA-Z]。这只匹配字母。我们不使用\w因为它会在十进制数中插入空格。

答案 1 :(得分:3)

单行非正则表达式答案:

def normal(sent):
    return ".".join(" " + s if i > 0 and s[0].isalpha() else s for i, s in enumerate(sent.split(".")))

这是一个使用类似方法的多行版本。您可能会发现它更具可读性。

def normal(sent):
    sent = sent.split(".")
    result = sent[:1]
    for item in sent[1:]:
        if item[0].isalpha():
            item = " " + item
        result.append(item)
    return ".".join(result)

使用正则表达式可能是更好的方法。

答案 2 :(得分:1)

没有任何检查的蛮力:

>>> sent = "This is a test.Start testing!"
>>> k = sent.split('.')
>>> ". ".join(l)
'This is a test. Start testing!'
>>> 

删除空格:

>>> sent = "This is a test. Start testing!"
>>> k = sent.split('.')
>>> l = [x.lstrip(' ') for x in k]
>>> ". ".join(l)
'This is a test. Start testing!'
>>> 

答案 3 :(得分:1)

另一种基于正则表达式的解决方案可能比Steven快一点(只有一种模式匹配,黑名单而不是白名单):

import re
re.sub(r'\.([^\s])', r'. \1', some_string)

答案 4 :(得分:0)

改善pyfunc的答案:

  
    
      

sent =“这是一个测试。开始测试!”

             

K = sent.split( '')

             

K =”。 ”。加入(k)的

             

k.replace('。','。')

    
  

'这是一个测试。开始测试!'