Как заменить точку пробелом, но не всеми пробелами? - PullRequest
0 голосов
/ 04 февраля 2019

Как я могу заменить определенные периоды пробелами, но не всеми периодами?

Например:

this_string = 'Man is weak.So they die'
that_string = 'I have a Ph.d'

Здесь я хочу получить такие результаты:

this_string = 'Man is weak So they die'
some_string = 'I have a Phd'

Я хочу, чтобы названия, такие как Ph.d, оставались одним словом, а точки, соединяющие 2 предложения, заменялись пробелом.


Это то, что у меня до сих пор:

re.sub('[^A-Za-z0-9\s]+',' ', this_string)

Это заменит все периоды пробелом.

Есть идеи, как это улучшить?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Сначала можно заменить все рассматриваемые точки новым символом, а затем разделить его на этот символ:

import re

abbreviations = ["Dr.", "Mrs.", "Mr.", "Ph.d"]
rx = re.compile(r'''(?:{})|((?<=[a-z])\.(?=\s*[A-Z]))'''.format("|".join(abbreviations)))

data = "Man is weak.So they die. I have a Ph.d"

# substitute them first
def repl(match):
    if match.group(1) is not None:
        return "#!#"
    return match.group(0)

data = rx.sub(repl, data)
for sent in re.split(r"#!#\s*", data):
    print(sent.replace(".", ""))

Это дает

Man is weak
So they die
I have a Phd

См. демо на ideone.com .

0 голосов
/ 04 февраля 2019

Вы можете использовать два регулярных выражения в качестве правил для изменения текста:

import re

text = 'Man is weak.So they die. I have a Ph.d.'

text = re.sub(r'([A-Za-z ]{1})(\.)([A-Z]{1})', r'\g<1>. \g<3>', text)  # remove the dot in r'\g<1>. \g<3>' to get '...weak So...'
print(text)  # Man is weak. So they die. I have a Ph.d.

text = re.sub(r'([A-Za-z ]{1})(\.)([a-z]{1})', r'\g<1>\g<3>', text)
print(text)  # Man is weak. So they die. I have a Phd.

Наконец, это не надежно, потому что это преобразование на основе правил.Что-то вроде Ph.D не сработает.

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