RegEx для извлечения десятичного числа - PullRequest
3 голосов
/ 10 мая 2019

У меня есть pandas df, где столбец - это текст с оценками в формате X / 10. Я хочу извлечь числители (которые могут быть десятичными). До сих пор я использовал:

my_df.text_column.str.extract('(\d*?\.?\d+(?=/10))')

Я думал, что у меня все хорошо, пока не увидел, что у меня есть числители вроде .10. То, что на самом деле происходит, это то, что в некоторых строках есть текст вроде: «Отличная работа. 10/10».

Как мне указать это при извлечении числа из этого столбца, если оно обнаружило "." должно быть, пришло после цифры?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 10 мая 2019

Самый простой способ (\d+(?:\.\d*)?(?=/10))


Образец

Nice job.10/10".
 "0.10/10", then it would be "0.10" 

Контрольный показатель

Regex1:   (\d+(?:\.\d*)?(?=/10))
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   2
Elapsed Time:    1.04 s,   1038.38 ms,   1038383 µs
Matches per sec:   96,303
2 голосов
/ 10 мая 2019

Do:

df.text.str.extract(r'(\d+\.?\d*?(?=/10))')

Вы хотите сначала найти число (\d+), за которым следует необязательный (\.?) и необязательный десятичный (\d*?)

Пример:

df = pd.DataFrame({'text':["Nice Job.10/10", "Score 9.5/10", "And now 5./10"]})
df.text.str.extract(r'(\d+\.?\d*?(?=/10))')



    0
0   10
1   9.5
2   5.
1 голос
/ 10 мая 2019

Я бы разделил шаблон числителя на два случая: один с "."и один без ".".

  • Числитель с ".": \d+\.\d+
  • Числитель без ".": \d+

Таким образомшаблон для числителя будет (\d+\.\d+|\d+).Собирая все вместе, мы имеем (\d+\.\d+|\d+)/\d+.

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

...