Ответ 1
Вместо регулярного выражения вы можете использовать строковые функции:
to_be_removed = ".,:!" # all characters to be removed
s = "John mom went there, but he wasn't there. So she said: 'Where are you!!'"
for c in to_be_removed:
s = s.replace(c, '')
s.split()
НО, в вашем примере вы не хотите удалять апостроф в John's
, но вы хотите удалить его в you!!'
. Таким образом, строковые операции завершаются с ошибкой в этой точке, и вам нужно точно отрегулированное регулярное выражение.
EDIT: возможно, простое регулярное выражение может решить вашу проблему:
(\w[\w']*)
Он будет захватывать все символы, начинающиеся с буквы и сохраняющие захват, в то время как следующий char является апострофом или буквой.
(\w[\w']*\w)
Это второе регулярное выражение для очень конкретной ситуации... Первое регулярное выражение может записывать слова типа you'
. Это будет aviod это и только захват апострофа, если он находится внутри слова (не в начале или в конце). Но в этот момент возникает такая ситуация: вы не можете зафиксировать апостроф Moss' mom
со вторым регулярным выражением. Вы должны решить, будете ли вы захватывать завершающий апостроф в именах, заканчивающихся wit s и определяющих право собственности.
Пример:
rgx = re.compile("([\w][\w']*\w)")
s = "John mom went there, but he wasn't there. So she said: 'Where are you!!'"
rgx.findall(s)
["John's", 'mom', 'went', 'there', 'but', 'he', "wasn't", 'there', 'So', 'she', 'said', 'Where', 'are', 'you']
ОБНОВЛЕНИЕ 2: Я нашел ошибку в своем регулярном выражении! Он не может записывать одиночные буквы, за которыми следует апостроф вроде A'
. Исправлено новое регулярное выражение:
(\w[\w']*\w|\w)
rgx = re.compile("(\w[\w']*\w|\w)")
s = "John mom went there, but he wasn't there. So she said: 'Where are you!!' 'A a'"
rgx.findall(s)
["John's", 'mom', 'went', 'there', 'but', 'he', "wasn't", 'there', 'So', 'she', 'said', 'Where', 'are', 'you', 'A', 'a']