принять числовое значение c без метки в строке, регулярное выражение - PullRequest
2 голосов
/ 03 апреля 2020

Ввод:

df=pd.DataFrame({'text':['value 123* 333','122* 666','722 888*']})
print(df)
             text
0  value 123* 333
1        122* 666
2        722 888*

Мне нужно извлечь из df['text'] только числовые c значения, но без * обозначить мой код:

df.text.str.extract(r'([0-9]+|[0-9]+\.[0-9]+)')

Но с этим код, возвращаются значения с символом * справа.

Ожидаемый результат:

text
333
666
722

1 Ответ

2 голосов
/ 03 апреля 2020

Вы можете использовать

df['text'].str.extract(r'(?=([0-9]+(?:\.[0-9]+)?))\1(?!\*)')

См. Демоверсию regex . Или вам также может потребоваться граница слова слева с r'\b(?=([0-9]+(?:\.[0-9]+)?))\1(?!\*)'. См. эту демонстрационную версию регулярного выражения .

Подробности регулярного выражения

  • (?=([0-9]+(?:\.[0-9]+)?)) - позитивный прогноз, который требует и включает в Группу 1 следующее последовательность шаблонов сразу справа:
    • [0-9]+ - 1+ цифр
    • (?:\.[0-9]+)? - необязательная последовательность . и 1+ цифр.
  • \1 - значение группы 1
  • (?!\*) - отрицательный прогноз, который не дает совпадения, если сразу справа есть символ *.

См. Python тест:

>>> import pandas as pd
>>> df=pd.DataFrame({'text':['value 123* 333','122* 666','722 888*']})
>>> df['text'].str.extract(r'(?=([0-9]+(?:\.[0-9]+)?))\1(?!\*)')
0    333
1    666
2    722
Name: text, dtype: object
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...