Как я могу удалить ТОЛЬКО знаки препинания, такие как "."а также ","? - PullRequest
2 голосов
/ 11 апреля 2019

Я хочу найти конкретные слова, такие как «заработок» или «доход».Для этого я создал список слов и произвел поиск слов в тексте.

Однако мой код не возвращает результатов для слов с дополнительным знаком пунктуации, например «заработок».или «доход».Теперь я хочу удалить эти знаки препинания, не удаляя точку в числе, например, «2,4», или любые другие метки, такие как «%».

Я уже пробовал

table = str.maketrans({key: None for key in string.punctuation})
text_wo_dots = text.translate(table)

и

text_wo_dots = re.sub(r'[^\w\s]',' ',text)

но это исключило все знаки препинания.

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Я предлагаю вам сначала разбить текст на отдельные слова, включая знаки препинания

text = ["This is an example, it contains 1.0 number and some words."]
raw_list = text.split()

Теперь вы можете удалить знаки препинания в конце элемента.

cleaned_words = []
for word in raw_list:
    if word[-1] in ['.', ',', '!', '?']:
        cleaned_words.append(word[:-1])
    else:
        cleaned_words.append(word)

Примечание 1: Если ваш текст содержит числа, такие как 1. для 1.0, вам также необходимо принять во внимание второй последний символ и оставить точку, если isdigit() оценивается как True
Примечание 2: , если существуют предложения, заканчивающиеся несколькими знаками препинания, вы должны запустить цикл while, чтобы удалить их, а затем добавлять только после того, как не будет найдено никаких знаков препинания.

while True:
    if word[-1] in ['.', ',', '!', '?']:
        word = word[:-1]
    else:
        break

cleaned_words.append(word)
0 голосов
/ 11 апреля 2019

Вы можете использовать отрицательный взгляд (?! и отрицательный взгляд (?<!, чтобы утверждать, что находится непосредственно слева, а что справа - не цифра:

(?<!\d)[^\w\s]+(?!\d)

Regex demo | Python demo

Например:

import re
text = "income,and 4.6 test"
text_wo_dots = re.sub(r'(?<!\d)[^\w\s]+(?!\d)',' ',text)
print(text_wo_dots) # income and 4.6 test
0 голосов
/ 11 апреля 2019

Что-то столь же простое, как это может сработать:

[\.,:!?][\n\s]

[\.,:!?] содержит некоторые знаки препинания, при необходимости вы можете добавить еще, а [\n\s] означает, что оно должноследовать за пробелом или символом новой строки.

Вот рабочий пример: https://regex101.com/r/TcR6Ct/2

Ниже приведен код Python:

import re

s = 'Bla, bla, bla 7.6 bla.'

pattern = '[\.,:!?][\n\s]'
s = re.sub(pattern, '', s+' ')
print(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...