работая над строками, питон - PullRequest
0 голосов
/ 26 октября 2010

Как определить функцию, которая принимает строку (предложение) и вставляет дополнительный пробел после точки, если за точкой непосредственно следует буква.

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

Это должно распечатать

«Это тест. Начните тестирование!»

Полагаю, мне следует использовать split(), чтобы вставить строку в список, но что дальше?

PS Решение должно быть максимально простым.

Ответы [ 5 ]

8 голосов
/ 26 октября 2010

Используйте 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, потому что он вставляет пробелы в десятичное число.

3 голосов
/ 26 октября 2010

Однострочный ответ без регулярных выражений:

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)

Использование регулярных выражений, вероятно, является лучшим способом.

1 голос
/ 26 октября 2010

Другое решение на основе регулярных выражений может быть немного быстрее, чем у Стивена (только одно совпадение с шаблоном и черный список вместо белого):

import re
re.sub(r'\.([^\s])', r'. \1', some_string)
1 голос
/ 26 октября 2010

Грубая сила без каких-либо проверок:

>>> 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!'
>>> 
0 голосов
/ 26 октября 2010

Улучшение ответа pyfunc:

sent = "Это тест. Начать тестирование!"

к = sent.split ( '')

к =». ».Join (к)

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

'Это тест. Начните тестирование! '

...