Разбор отрицательных чисел в финансовой отчетности - PullRequest
0 голосов
/ 07 декабря 2018

Я анализирую финансовые документы, и цель состоит в том, чтобы разбить строку на 3 компонента.Например, у меня есть следующая строка:

Telephone  9,000 9,000

, и когда я использую эту команду регулярного выражения:

regex = r"([A-Za-z ]+)(?=\d|\S).*?([\d,]+)\s([\d,]+)"
re.findall(regex, <string>)

, и это вывод, который я получаю:

('Telephone ', '5,172', '1,771')

Теперь предположим, что у меня есть отрицательные числа (они представлены в скобках в финансовых документах) в этом финансовом отчете:

string = Telephone  (9,000) (9,000)

Как мне разбить его на три группы путем учета скобок?Я пытался использовать \(\* и \)\* для учета нуля или более скобок, но он возвращает None:

regex = r"([A-Za-z ]+)(?=\d|\S).*?(\(\*[\d,]+\)\.)\s(\(\*[\d,]+\)\)"
re.findall(regex, string)

Как я могу обновить свою функцию регулярного выражения для учета этого случая?

Кроме того, если в строке есть дефис, как мне это узнать?

string = Telephone  (9,000) -

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

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

Предполагая, что все входные данные правильно сформированы (то есть нет пропущенных скобок или чего-то в этом роде)и вы просто хотите извлечь три значения, вы можете использовать это регулярное выражение:

([A-Za-z ]+)\s+(\(?[\d,]+\)?)\s+(\(?[\d,]+\)?)

Первая часть такая же, как ваша попытка.Затем этот шаблон повторяется дважды:

\s+(\(?[\d,]+\)?)

В начале мы сначала сопоставляем некоторый пробел \s+, затем начинается группа захвата.В группе захвата мы сначала видим, есть ли какие-либо скобки \(?.? - это квантификатор, который нужно использовать здесь, потому что мы допускаем 0 или 1 скобку.А затем простой класс символов [\d,]+, соответствующий номеру, за которым следует дополнительная закрывающая скобка \)?.

Демо

0 голосов
/ 07 декабря 2018

Для меня работает следующий шаблон:

texts = ['Telephone  9,000 9,000',
         'Telephone  (9,000) (9,000)',
         'Telephone  (9,000) -'
         ]
for text in texts:
    print(re.findall("([\w+ ]+) (\(?[\d,-]+\)?) (\(?[\d,-]+\)?)", text))

Вывод

['Telephone', '9,000', '9,000']
['Telephone', '(9,000)', '(9,000)']
['Telephone', '(9,000)', '-']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...