>>> sentence = "Thomas Jefferson began building Monticello at the age of 26."
>>> tokens1 = re.split(r"([-\s.,;!?])+", sentence)
>>> tokens2 = re.split(r"[-\s.,;!?]+", sentence)
>>> tokens1 = ['Thomas', ' ', 'Jefferson', ' ', 'began', ' ', 'building', ' ', 'Monticello', ' ', 'at', ' ', 'the', ' ', 'age', ' ', 'of', ' ', '26', '.', '']
>>> tokens2 = ['Thomas', 'Jefferson', 'began', 'building', 'Monticello', 'at', 'the', 'age', 'of', '26', '']

Можете ли вы объяснить цель ( и )?

-1
X. Wang 2 Янв 2018 в 04:32

2 ответа

Лучший ответ

(..) в регулярном выражении обозначает захватывающую группу (также известную как "захватывающая скобка"). Они используются, когда вы хотите извлечь значения из шаблона. В этом случае вы используете re.split функция, которая ведет себя определенным образом, когда в шаблоне есть группы захвата. По документации:

re.split (pattern, string, maxsplit = 0, flags = 0)

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

Итак, обычно разделители, используемые для разделения строки, не присутствуют в результате, как во втором примере. Однако, если вы используете (), текст, записанный в группах, также будет в результате разделения. Вот почему в первом примере вы получаете много ' '. Это то, что захватила ваша группа ([-\s.,;!?]).

3
user2864740 2 Янв 2018 в 01:47

С группой захвата (()) в регулярном выражении, используемом для разделения строки, разделение будет включать захваченные части.

В вашем случае вы разделяете один или несколько символов пробелов и / или знаков препинания и захватываете последний из этих символов для включения в разделенные части, что кажется странным. Я ожидал, что вы, возможно, захотите захватить весь разделитель, который будет выглядеть как r"([-\s.,;!?]+)" (захват одного или нескольких символов пробела / знаков пунктуации, вместо сопоставления одного или нескольких, а захват только последнего).

1
ysth 2 Янв 2018 в 01:40