Извлечение чисел из строки при определенных условиях - PullRequest
4 голосов
/ 11 июня 2019

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

  • Число НЕ МОЖЕТ быть в начале строки
  • НЕ МОЖЕТ появляться после слова «Нет» или после слова «Вопрос»

Также, если это возможно, если номер имеет букву "е" сразу после него, я бы тоже хотел сохранить ее. Однако это менее важно.

Это то, что я до сих пор нашел, чтобы найти все числа, но я не знаю, как кодировать условия, которые я упомянул выше.

testNumbers = re.findall(r'\d+', row['Name'])

Для данной строки: «Тест T860, артикул № 9712250 787»

Я бы хотел, чтобы выражение регулярного выражения возвращало

[860, 787]

Ответы [ 2 ]

5 голосов
/ 11 июня 2019

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

(?!^)(?<!\d)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)

В Python объявить как необработанный строковый литерал:

pattern = r'(?!^)(?<!\d)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)'

См. Демоверсию regex

информация

  • (?!^) - не в начале строки
  • (?<!\d) - нет цифры сразу перед тем, как будет разрешено текущее местоположение
  • (?<!\bNo\.\s) - нет No. и пробел непосредственно перед тем разрешен
  • (?<!\bQuestion\s) - нет Question и пробел непосредственно перед разрешением
  • (\d+) - Группа 1: одна или несколько цифр
  • (?!\d) - нет цифры сразу после того, как текущее местоположение разрешено.

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

df = pd.DataFrame({'text':[" Test T860 Article No. 9712250 787"," Test F199 Article Question 9712250787"]})
df['numbers'] = df['text'].str.findall(r'(?!^)(?<!\d)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)').apply(','.join)

Выход:

>>> df
                                     text  numbers
0       Test T860 Article No. 9712250 787  860,787
1   Test F199 Article Question 9712250787      199
0 голосов
/ 11 июня 2019

Здесь мы можем использовать выражение с границами слова и квантификатором:

\b[A-Z]+(\d+)\b|\b([0-9]{1,3})\b

Демо

RegEx

Если это выражение не былоЕсли вы хотите или хотите изменить его, посетите regex101.com .

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...