Регулярное выражение Python findall возвращает пустую строку, когда ее не спрашивают - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь извлечь зарплату из списка строк. Я использую функцию regex findall (), но она возвращает много пустых строк, а также зарплаты, и это вызывает у меня проблемы позже в моем коде.


sal= '41 000€ à 63 000€ / an' #this is a sample string for which i have errors

regex = ' ?([0-9]* ?[0-9]?[0-9]?[0-9]?)'#this is my regex

re.findall(regex,sal)[0]
#returns '41 000' as expected but:
re.findall(regex,sal)[1]
#returns: '' 
#Desired result : '63 000'

#the whole list of matches is like this:
['41 000',
 '',
 '',
 '',
 '',
 '',
 '',
 '63 000',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '']
# I would prefer ['41 000','63 000']

Кто-нибудь может помочь? Спасибо

1 Ответ

3 голосов
/ 04 апреля 2019

Использование re.findall даст вам группы захвата, когда вы используете их в своем шаблоне, и вы используете группу, где почти все необязательно, давая вам пустые строки в результате.

В вашем паттерне вы используете [0-9]*, что соответствует 0+ раз цифре. Если нет ограничения на начальные цифры, вместо этого вы можете использовать [0-9]+, чтобы не сделать его необязательным.

Вы можете использовать этот шаблон с группой захвата:

(?<!\S)([0-9]+(?: [0-9]{1,3})?)€(?!\S)

Regex demo | Python demo

Объяснение

  • (?<!\S) Утверждение того, что слева, не является символом без пробелов
  • ( Группа захвата
    • [0-9]+(?: [0-9]{1,3})? соответствует 1+ цифрам, за которыми следует дополнительная часть, которая соответствует пробелу и 1-3 цифрам
  • ) Закрыть группу захвата
  • Совпадение буквально
  • (?!\S) Утверждение того, что справа, не является символом без пробелов

Ваш код может выглядеть следующим образом:

import re
sal= '41 000€ à 63 000€ / an' #this is a sample string for which i have errors
regex = '(?<!\S)([0-9]+(?: [0-9]{1,3})?)€(?!\S)'
print(re.findall(regex,sal))  # ['41 000', '63 000']
...