Python - удаление всех вхождений символа только тогда, когда он появляется перед словами без заглавных букв - PullRequest
0 голосов
/ 18 марта 2020

У меня есть следующая строка:

mystring= "Foo some \n information \n Bar some \n more \n information \n Baz more \n information"

Я бы хотел оставить "\ n" только в том случае, если ему предшествует слово, начинающееся с заглавной буквы. Я хотел бы удалить все другие случаи "\ n" в моем предложении.

Желаемый вывод:

"Foo some information \n Bar some more information \n Baz more information"

Есть ли способ сделать это с помощью re.sub? Я могу думать о попытке разделить слова и использовать аргумент word[0].isupper(). Тем не менее, я считаю, что может быть способ отождествить заглавные слова с регулярным выражением.

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Если текст может охватывать абзацы (несмотря на ссылку на «предложение» в вопросе), вы можете использовать регулярное выражение

 *\n *(?!\n*[A-Z])

(с пробелом, предшествующим первому *).

Совпадения заменяются одним пробелом.

Демонстрация

Выполняет следующие операции:

 *            * match 0+ spaces 
\n            * match a newline char
 *            * match 0+ spaces
(?!\n*[A-Z])  * match 0+ newlines followed by an uc letter
              * in a negative lookahead

Как показано на ссылка, текст

Now is the time for all good regexers
to social distance themselves.
Here's to negative lookbehinds!

And also to positive lookbehinds!

становится

Now is the time for all good regexers to social distance themselves.
Here's to negative lookbehinds!

And also to positive lookbehinds!

, даже несмотря на то, что после символа новой строки, следующего за negative lookbehinds!, непосредственно не следует заглавная буква, а другая новая строка, за которой следует заглавная case case.

Если строка заканчивается новой строкой, она будет удалена. Это потому, что я использую негативный взгляд, а не позитивный.

1 голос
/ 18 марта 2020

Вы можете использовать это отрицательное регулярное выражение:

>>> mystring = "Foo some \n information \n Bar some \n more \n information \n Baz more \n information"
>>> print (re.sub(r'\n(?! *[A-Z]) *', '', mystring))
Foo some information
 Bar some more information
 Baz more information

Подробности RegEx:

  • \n: сопоставить разрыв строки
  • (?! *[A-Z]) *: отрицательный взгляд, чтобы утверждать, что у нас нет заглавной буквы после необязательных пробелов. соответствует 0 или более пробелов после этого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...