Pandas Извлечение Regex, дающее различный вывод re.search? - PullRequest
0 голосов
/ 25 апреля 2020

Итак, я пытаюсь использовать регулярные выражения для извлечения значений веса из столбца моего pandas фрейма данных ... по какой-то причине ожидать, что это не правильно извлечь.

all_data["name"].iloc[0] = "220 grams" # this is purely to show my issue

pattern  = "[0-9]+ ?(gram|mg|Gram|GRAM)"

gram_values = all_data["name"].str.contains(pattern)

re.search(pattern, all_data["name"].iloc[0])

Вывод

<re.Match object; span=(0, 8), match='220 gram'>

Как и предполагалось, он экспортирует 220 грамм. Ура.

СЕЙЧАС, если я использую метод pandas .str.extract ...

all_data["name"].str.extract(pattern)

Тогда вывод будет

extracts

Тот же шаблон регулярных выражений, два разных выхода. Так какого черта я здесь делаю не так? Как строка регулярного выражения может извлекать разные значения?

1 Ответ

2 голосов
/ 25 апреля 2020
Поведение

Pandas Series.str.extract() объяснено в документации, оно возвращает только содержимое группы захвата .

pat : string Шаблон регулярного выражения с группами захвата

Ваше регулярное выражение содержит одну группу захвата (gram|mg|Gram|GRAM), поэтому возвращается ее содержимое.

Чтобы заставить регулярное выражение работать в Pandas str.extract оберните его группой захвата и сделайте другую группу не захватывающей :

r"([0-9]+ ?(?:gram|mg|Gram|GRAM))"
# |        |non-capturing group||
# |_______ capturing group______|
...