Разделить строку с помощью регулярного выражения, как игнорировать апостроф?
Я делаю учебник по проверке орфографии в Python, и он использует это регулярное выражение:
import re
def split_line(line):
return re.findall('[A-Za-z]+(?:\`[A-Za-z)+)?',line)
Мне было интересно, если вы могли бы помочь мне изменить эту функцию, чтобы она игнорировала '
т.е. если я введу строку he's
я получу ['he's']
и не ['he','s']
,
2 ответа
Сначала вам нужно исправить исходное выражение, заменив )
с ]
как упомянул Марчин. Тогда просто добавь '
в список разрешенных символов (без обратной косой черты):
import re
def split_line(line):
return re.findall('[A-Za-z\']+(?:\`[A-Za-z]+)?',line)
split_line("He's my hero")
#["He's", 'my', 'hero']
Конечно, это не будет рассматривать крайние случаи, когда апостроф находится в начале или в конце слова.
Ваше регулярное выражение должно соответствовать одной или нескольким буквам, а затем необязательному вхождению обратной галочки и снова одной или нескольким буквам. Вы можете поместить обратную галочку в класс символов и добавить в класс.
Обратите внимание, что вам не нужно экранировать, если вы используете строковый литерал в двойных кавычках:
re.findall(r"[A-Za-z]+(?:['`][A-Za-z]+)*", line)
См . демонстрацию регулярных выражений . Детали:
-
[A-Za-z]+
- одна или несколько букв ASCII (используйте[^\W\d_]+
для соответствия любой одной или нескольким буквам Unicode) -
(?:['`][A-Za-z]+)*
- ноль или более вхождений'
или обратная кавычка, за которой следует одна или несколько букв ASCII.
См. демонстрацию Python:
import re
text = "And he's done it o`key!"
print(re.findall(r"[A-Za-z]+(?:['`][A-Za-z]+)*", text))
# => ['And', "he's", 'done', 'it', 'o`key']