Прописать каждое первое слово предложения в абзаце - PullRequest
2 голосов
/ 18 мая 2019

Я хочу прописать первое слово после точки во всем абзаце (str), полном предложений. Проблема в том, что все символы в нижнем регистре.

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

text = "here a long. paragraph full of sentences. what in this case does not work. i am lost" 
re.sub(r'(\b\. )([a-zA-z])', r'\1' (r'\2').upper(), text) 

Я ожидаю что-то вроде этого:

«Здесь длинный. Параграф, полный предложений. Что в этом случае не работает. Я потерян».

Ответы [ 2 ]

6 голосов
/ 18 мая 2019

Вы можете использовать re.sub с lambda:

import re
text = "here a long. paragraph full of sentences. what in this case does not work. i am lost" 
result = re.sub('(?<=^)\w|(?<=\.\s)\w', lambda x:x.group().upper(), text)

Выход:

'Here a long. Paragraph full of sentences. What in this case does not work. I am lost'

Regex Объяснение:

(?<=^)\w: соответствуетбуквенно-цифровой символ, которому предшествует начало строки.

(?<=\.\s)\w: соответствует буквенно-цифровому символу, которому предшествует точка и пробел.

0 голосов
/ 18 мая 2019

Вы можете использовать ((?:^|\.\s)\s*)([a-z]) regex (, которое не зависит от обходных путей, которые иногда могут быть недоступны на используемом вами диалекте регулярных выражений, и, следовательно, более просты и широко поддерживаются. Как, например, Javascript не делаетвсе же широко поддерживают lookbehind, хотя он поддерживается в EcmaScript2018, но пока еще не широко поддерживается ), где вы фиксируете либо начальный ноль, либо несколько пробелов в начале предложения, или один или несколько пробелов, за которыми следует буквальная точка . изахватите его в group1 и затем захватите строчную букву, используя ([a-z]), и захватите в group2 и замените сопоставленный текст захваченным текстом group1 и group2, сделав его заглавным, используя лямбда-выражение.Проверьте этот код Python,

import re

arr = ['here a long.   paragraph full of sentences. what in this case does not work. i am lost',
       '   this para contains more than one space after period and also has unneeded space at the start of string.   here a long.   paragraph full of sentences.  what in this case does not work. i am lost']

for s in arr:
    print(re.sub(r'(^\s*|\.\s+)([a-z])', lambda m: m.group(1) + m.group(2).upper(), s))

Output,

Here a long.   Paragraph full of sentences. What in this case does not work. I am lost
   This para contains more than one space after period and also has unneeded space at the start of string.   Here a long.   Paragraph full of sentences.  What in this case does not work. I am lost

И если вы хотите избавиться от лишних пробелов и уменьшить их до одного пробела, просто возьмите \s*из группы 1 и используйте это регулярное выражение ((?:^|\.\s))\s*([a-z]) и с обновленным кодом Python,

import re

arr = ['here a long.   paragraph full of sentences. what in this case does not work. i am lost',
       '   this para contains more than one space after period and also has unneeded space at the start of string.   here a long.   paragraph full of sentences.  what in this case does not work. i am lost']

for s in arr:
    print(re.sub(r'((?:^|\.\s))\s*([a-z])', lambda m: m.group(1) + m.group(2).upper(), s))

Вы получаете следующее, когда дополнительный пробел сокращается до одного пробела, который часто может быть желательным,

Here a long. Paragraph full of sentences. What in this case does not work. I am lost
This para contains more than one space after period and also has unneeded space at the start of string. Here a long. Paragraph full of sentences. What in this case does not work. I am lost

Кроме того, если бы это было сделано с помощью механизма регулярных выражений PCRE, то вы могли бы использовать \U в самом регулярном выражении без необходимости использовать лямбда-функции и просто могли заменить его на \1\U\2

Демонстрация регулярных выражений для регулярных выражений на основе PCRE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...