Разница между двумя шаблонами регулярных выражений в поиске слов, заканчивающихся на 'ing' - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь найти слова, оканчивающиеся на 'ing', в следующем предложении = "Играть в подвижные игры, когда на улице всегда идет дождь!"

Теперь это не мой вопрос, поскольку я нашел необходимыйшаблон регулярных выражений, чтобы сделать это - (r'\b([A-z]+ing)\b').

Дело в том, что я не могу понять, почему работает выше, но не то, что я попробовал ниже:

re.findall('([A-z]+ing)$',"Playing outdoor games when it's raining outside is always fun!")

Возвращает пустой список, хотя приведенное ниже не

re.findall('([A-z]+ing)$','amazing')

Возвращает потрясающий

Таким образом, этот шаблон может соответствовать отдельным словам, заканчивающимся на 'но не слова в предложениях?Почему?

Что мне показалось еще более странным, так это: re.findall('\b([A-z]+ing)\b',"Playing outdoor games when it's raining outside is always fun!") не возвращает совпадений (пустой список).Единственное отличие состоит в том, что мы не используем необработанную строковую нотацию (r)

. Я думал, что нотация 'r' необходима только тогда, когда мы хотим избежать обратной косой черты.Так что в этом случае: Pattern1 - '\ b ([Az] + ing) \ b' должен соответствовать игре, дождю и т. Д. Вместо Pattern2- r '\ b ([Az] + ing) \ b ' Что именно я неправильно понял?Я искал много ответов Stack Overflow и официальную документацию по регулярным выражениям Python, и теперь я более запутан, чем когда я начинал, особенно в отношении использования 'r' .

1 Ответ

3 голосов
/ 22 сентября 2019

$ соответствует концу строки или концу всего текста (в зависимости от настройки флага, здесь: только конец текста).Использование его сразу после «ing» заставляет «ing» появляться в конце.

Необработанная строковая запись позволяет экранированным символам, таким как \b, проходить к базовой функции (здесь: findall)для дальнейшей обработки (здесь: в качестве специального кода регулярного выражения для границы слова).

Без необработанной нотации строки \b - это управляющий код BACKSPACE (hex 0x08).Этот символ обрабатывается механизмом регулярных выражений как простое совпадение.

Использование [A-z] для сопоставления всех букв также неверно.Это на самом деле означает совпадение любого символа в таблице Unicode между A и z.Как вы можете видеть здесь это включает, например, [, ^ и \.Если вам нужны только буквы ASCII, используйте [A-Za-z].Если вы хотите, чтобы все символы слова Unicode (буквы и цифры на любом поддерживаемом языке и подчеркивания) использовали \w.

Для работы с регулярными выражениями, например, https://regex101.com/

...