Python регулярное выражение для удаления всего слова, если есть пунктуация - PullRequest
0 голосов
/ 09 марта 2020

Я пытался безуспешно в течение последних 2 дней, и это сводит меня с ума. Я пытаюсь удалить любое целое слово в python, если оно связано с какой-либо пунктуацией.

Я пытался использовать \ w, но, к сожалению, это включает _. Я также пытаюсь сохранить слова с дефисами.

Заранее спасибо

РЕДАКТИРОВАТЬ:

Примером может быть:

Ввод: (черный ре -d белый, желтый, синий [p] .o оранжевый) зеленый

Выход: re-d зеленый

Ответы [ 4 ]

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

Вы можете попробовать это:

\w+\b\S

\ w + \ b получает все целые слова, тогда \ S ограничит эти целые слова целыми словами, за которыми следует не символ пробела. Другое, возможно, более явное решение может выглядеть следующим образом: \w+\b[,.?!] с любой пунктуацией, которую вы хотите сопоставить в скобках.

В качестве примечания я настоятельно рекомендую regexr.com для любых и всех потребностей регулярных выражений.

0 голосов
/ 10 марта 2020

Код

import re

def get_words(s):
  pattern = r'(?:^|(?<=\s))[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)?(?:$|(?=\s))'
  return ' '.join(re.findall(pattern, s))

Пояснение

(?:^|(?<=\s)) - matches beginning of word or space
(?:$|(?=\s)) - matches end of string or space
[a-zA-Z0-9]+ - one or more letters or numbers
[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)? - matches letters/numbers and optionally followed
                                 by hypen followed by letters and numbers
                                 (so only accepts single hyphens between letters or numbers)

Код теста

s1 = "(black re-d whit.e yellow, blue[p].o orange) green"
s2 = "but, I am so tired."
s3 = "in the years 1902-1905 or was it 1904, or 1905"
s4 = """And underneath the guy on the horse’s picture, it always says: ‘Since 1888 we have been molding boys into splendid, clear-thinking young men."""

for i, s in enumerate([s1, s2, s3, s4]):
  print(f'Test {i}: {s}\nOutput:{get_words(s)}\n')

Результат

Тест 0: (черный красный с желтым, синий [p] .o оранжевый) зеленый

Выход: повторно d зеленый

Тест 1: но я так устал.

Вывод: я такой

Тест 2: в годах 1902-1905 или это было 1904, или 1905

Выход: в годы 1902-1905 или это было или 1905

Тест 3: И под парнем на На изображении лошади всегда написано: «С 1888 года мы лепили мальчиков в великолепных, ясных и умных юношей.

Вывод: А под парнем на нем всегда 1888 год мы лепили мальчиков в здравомыслящий молодой

0 голосов
/ 09 марта 2020

Предполагая, что слова, за которыми следуют знаки пунктуации, не должны быть удалены, и один из них не касается лишних пробелов в результирующей строке после удаления слов, можно использовать следующее регулярное выражение:

\S*[.,:;!?-]\S*[^\s\.,:;!?-]

Демо

Токены регулярных выражений:

\S*            # match 0+ chars other than whitespace
[.,:;!?-]      # match a punctuation char
\S*            # match 0+ chars other than whitespace
[^\s\.,:;!?-]  # match a char other than a whitespace or a punctuation char 
0 голосов
/ 09 марта 2020

Я думаю, вы могли бы использовать код ниже:

import re
s = "See ,remove .these words from the original string or? !not"
s = re.sub(r'\s+\w+\b\S', '', s) # Matches words that end with punctuation.
s = re.sub(r'\s+\S\b\w+', '', s) # Matches words that start with punctuation.
print(s)

При запуске выдает:

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