Захват номера после фразы - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть строки вроде:

  1. Ваш подписной бонус составляет 123 000
  2. В этом году бонус подписания плохой. подписной бонус на этот год составляет 123 000 евро
  3. Бонус составляет 14 456, но бонус подписи.

Я хочу вывод как:

a) Если после любого числа стоит signing bonus, оставьте эту часть строки и удалите все. См. Ожидаемый результат 1 & 2

б) Если за номером не следует signing bonus, я должен получить 1-ю часть укуса. См. Ожидаемый результат 3

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

  1. - 123 000

  2. на этот год составляет 123 000 евро

  3. Бонус составляет 14 456, но

My Regex:

match1 = re.findall(r'(?<=\bSigning Bonus\b)\s*(?:\S+\b\s*){0,8}',value, re.I|re.M|re.DOTALL)

Он обрабатывает выходные данные 1 и 2, но не может обрабатывать выходные данные 3.

Я также открыт для решения, которое можно сделать и без регулярных выражений !!

Ответы [ 3 ]

4 голосов
/ 25 апреля 2019

попробуйте ниже код.

s1 = "Your signing bonus is 123,000"
s2 = "This year signing bonus is bad. the signing bonus for this year is EUR 123,000"
s3 = "The bonus is 14,456, but signing bonus."
regex = '[0-9]'
import re
def format_string(s):
    for subs in s.split('signing bonus'):
        if re.findall(regex, subs):
            print subs.strip()

format_string(s1)
format_string(s2)
format_string(s3)

вывод:

is 123,000
for this year is EUR 123,000
The bonus is 14,456, but
2 голосов
/ 25 апреля 2019

Если вы в порядке, используя re.sub, вы можете использовать это регулярное выражение для замены сопоставленного текста пустой строкой,

^[^\d\n]*signing bonus\s*|\s*signing bonus[^\d\n]*$

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

Regex Demo

код Python,

import re

arr = ['Your signing bonus is 123,000','This year signing bonus is bad. the signing bonus for this year is EUR 123,000','The bonus is 14,456, but signing bonus.']

for s in arr:
 print(s, '-->', re.sub(r'^[^\d\n]*signing bonus\s*|\s*signing bonus[^\d\n]*$', '', s))

печать

our signing bonus is 123,000 --> is 123,000
This year signing bonus is bad. the signing bonus for this year is EUR 123,000 --> for this year is EUR 123,000
The bonus is 14,456, but signing bonus. --> The bonus is 14,456, but
0 голосов
/ 25 апреля 2019

Это напечатает ваш ответ:

statements = [
    'Your signing bonus is 123,000',
    'This year signing bonus is bad. the signing bonus for this year is EUR 123,000',
    'The bonus is 14,456, but signing bonus.',
]
for statement in statements:
    ans = statement.split('signing bonus')
    if not ans:
        print('')
        continue
    for i in range(len(ans) - 1, -1, -1):
        for word in ans[i].split(' '):
            try:
                number = int(word.replace(',', ''))
                print(ans[i].strip())
                break
            except:
                pass

Выход:

is 123,000
for this year is EUR 123,000
The bonus is 14,456, but
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...