2016-12-30 3 views
0

Я хочу написать регулярное выражение в Python, что делает следующийДобавление недостающих периодов в Python переводы строк

Преобразовать все предложения, которые заканчиваются [alphanumeric]\n и заменить его «»

Так, например

I went there 
I also went there. 
It is 


That- 
I too went there! 
It went there? 
It is 3 

так скажем мы

должны быть преобразованы в

I went there. 
I also went there. 
It is. 


That- 
I too went there! 
It went there? 
It is 3. 

Как я могу это сделать?

EDIT: Строка вход

s = "I went there\nI also went there.\nIt is\n\nThat-\nI too went there!\nIt went there?\nIt is 3" 

Кроме того, "?" не следует добавлять с помощью "."

EDIT2: Я изменил пример, поэтому он содержит двойной \n и предложение, заканчивающееся -. Поэтому «-» не следует добавлять с помощью «.».

+1

Вы пытались написать что-то самостоятельно? – Dekel

+0

Попробуйте 're.sub (r '(?

+0

Вы начинаете с того, что хотите оставить только восклицательные знаки, заканчивающиеся концами , и только периоды (добавление периода ко всему остальному); но затем в вашем примере вы оставляете только знак конца строки. –

ответ

4

попробовать что-то вроде этого:

s = 'I went there' 

if s[-1] not in ['!', ',', '.', '\n']: 
    s += '.' 

Edit:

С вашим новым входом, должно работать:

new_string = ''.join('{}.\n'.format(item) if (item and item[-1] not in '!?.,-') else '{}\n'.format(item) for item in s.split('\n')) 

Если вы не хотите \n в конце new_string, вы можете удалить его:

new_string = new_string.rstrip('\n') 

Выход:

>>> s = "I went there\nI also went there.\nIt is\n\nThat-\nI too went there!\nIt went there?\nIt is 3" 
>>> new_string = ''.join('{}.\n'.format(item) if (item and item[-1] not in '!?.,-') else '{}\n'.format(item) for item in s.split('\n')) 
>>> 
>>> print(new_string) 
I went there. 
I also went there. 
It is. 

That- 
I too went there! 
It went there? 
It is 3. 
+0

Мои извинения. Я имел в виду, что я смотрю на одну длинную строку '' с "\ n", а не на работу с несколькими отдельными строками. См. EDIT – user5739619

+1

, который всегда умеет предлагать нереджекс-решения. –

+0

это сработало. Благодаря! – user5739619

0

Простое решение с использованием re.sub() функции и конкретный шаблон регулярного выражения:

s = "I went there\nI also went there.\nIt is\n\nThat-\nI too went there!\nIt went there?\nIt is 3" 
s = re.sub(r'(?<=[^,.!?-\s])(\n|$)', r'.\1', s, re.M) 
print(s) 

Выход:

I went there. 
I also went there. 
It is. 

That- 
I too went there! 
It went there? 
It is 3. 

(\n|$) - соответствует разрыву строки (новая строка) или конец строки

(?<=[^,.!?-\s]) - гарантирует, что нет никаких конкретных символов до указанного выше матча

\1 - не относятся к ударному первой группе, которая (\n|$)

+0

Thats close, но не совсем то, что я хотел. Я внес изменения в «EDIT2», который объясняет, что я искал – user5739619

+0

@ user5739619, я не ожидал, что вы измените начальное условие, но, в любом случае, проверьте мое обновление – RomanPerekhrest

Смежные вопросы