Как заставить этот шаблон Regex работать для обеих строк - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть строки 'amount $165' и 'amount on 04/20' (и несколько других вариантов, с которыми у меня пока нет проблем). Я хочу иметь возможность запускать выражение и возвращать доступное числовое значение IF (в первой строке это 165) и ничего не возвращать, если оно недоступно, И не путать с датой (вторая строка). Если я пишу код следующим образом, он возвращает 165, но он также возвращает 04 от второго.

 amount_search = re.findall(r'amount.*?(\d+)[^\d?/]?, string)

Если я пишу его следующим образом, он не включает ни

amount_search = re.findall(r'amount.*?(\d+)[^\d?/], string)

Как изменить то, что я должен вернуть 165, но не 04?

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

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

Захват первых встреченных цифр в группе и утверждение граница с пропуском справа.

\bamount [^\d\r\n]*(\d+)(?!\S)

По частям

  • \bamount Соответствует количеству, за которым следует пробел, которому предшествует граница слова
  • [^\d\r\n]* Совпадение 0 или более раз с любым символом, кроме ди git или новых строк
  • (\d+) Захват группа 1 , совпадение с 1 или более цифрами
  • (?!\S) Утверждение граница пробелов справа

Regex demo

0 голосов
/ 16 апреля 2020

Попробуйте это:

from re import sub
your_digit_list = [int(sub(r'[^0-9]', '', s)) for s in str.split() if s.lstrip('$').isdigit()]

0 голосов
/ 16 апреля 2020

попробуйте это ^amount\W*\$([\d]{1,})$

$ указывает конец строки, для того, что я тестировал, используйте .* или ? также работает. группируя цифры, вы можете исключить / внутри формата даты.

надеюсь, это поможет:)

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