Разделить строку с помощью регулярного выражения, как игнорировать апостроф?

Я делаю учебник по проверке орфографии в 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']
Другие вопросы по тегам