python регулярное выражение огляни загадку - PullRequest
0 голосов
/ 13 июля 2020

ОТредактированный вопрос с более подробным примером строки

Попытка найти регулярное выражение, которое может извлекать только числовые значения из приведенного ниже образца текста, если за ними следует фраза 'PLD GLTY' . Я добавил все варианты этого контента, которые смог найти в своих данных. Вот они.

'УКАЗАТЕЛЬ 2903.04.A НЕДОБРОВОЛЬНЫЙ PLD GLTY @ TRL JURY', 'УКАЗАТЕЛЬ 2903.01.B AGGRAVATED NOLLE', 'УКАЗАТЕЛЬ 2911.01 ROBBERY PLD GLTY @ TRL JURY', 'УКАЗАТЕЛЬ 2905.01.A (2 ) NOLLE ',' INDICT 2903.02.B NOLLE ',' INDICT 2911.02.A (2) NOLLE ',' INDICT 2903.111.A (1) FELONIOUS ASSAULT PLD GLTY ',' INDICT 2913.05 ROBBERY PLD GLTY @ TRL JURY ',' INDICT 2923.13.A (3) ИМЕЕТСЯ ОРУЖИЕ В СЛУЧАЕ ИНВАЛИДНОСТИ PLD GLTY '

Ожидаемый результат (в идеале в список python)

[' 2903.04 ',' 2911.01 ',' 2903.111 ',' 2913.05 ',' 2923.13 ']

ОБРАЗЦЫ, РАБОТАЮЩИЕ ЧАСТИЧНО

Пример, который в основном работает

29..\...+(?=PLD GLTY)

Работает лучше, но все еще захватывает слишком много

\d{4}\.\d{2}(.*PLD GLTY)

Почти готово, все еще не совсем

(\d{4}\.\d{2}\d?)(.*PLD GLTY)

Цель состоит в том, чтобы взять приведенный выше текст, который находится в столбце pandas df, и извлеките из этого текста только числовые статуты, в которых ответчик признал себя виновным.

Спасибо за вашу помощь всем, вы, мастера регулярных выражений .

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Я бы сформулировал вашу проблему как:

str = 'This is statute 2913.42 and defendant PLD GLTY, This is statute 2913.405 and defendant at pre-trial PLD GLTY, This is statute 2913.44 without any plea of guilt'
matches = re.findall(r'\b\d+(?:\.\d+)?(?=[^\d]+\bPLD GLTY)', str)
print(matches)

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

['2913.42', '2913.405']

Регулярное выражение logi c говорит, что нужно найти каждое десятичное число со свойством, которое мы можем ожидать без другого числа, и найдите текст PLD GLTY где-нибудь позже в строке.

1 голос
/ 13 июля 2020

Вы почти у цели. Я только что изменил ваш пример просмотра вперед, чтобы добавить нежадный .* и несколько тонких настроек:

(\d{4}\.\d{2,3}).*?(?=PLD GLTY)

Код :

import re

str = 'This is statute 2913.42 and defendant PLD GLTY, This is statute 2913.405 and defendant at pre-trial PLD GLTY, This is statute 2913.44 without any plea of guilt'

print(re.findall(r'(\d{4}\.\d{2,3}).*?(?=PLD GLTY)', str))
# ['2913.42', '2913.405']

d{2}\d? is лучше записывать как \d{2,3} (цифры всегда появляются 2 или 3 раза).

str является встроенным в Python, поэтому не рекомендуется использовать его как имя переменной, имя пользовательской функции или что-то еще, хотя я использовал здесь для соответствия вашему коду.

0 голосов
/ 13 июля 2020

(Это предназначено как расширенный комментарий , а не как ответ. Пожалуйста, не голосуйте за него, иначе мне, возможно, придется удалить его снова.)

Пример строки, приведенной в вопросе, недостаточен для проверки того, будут ли данные решения гарантировать, что в вывод будет включен только последний номер перед любым появлением PLD GLTY.

С этой строкой:

str = "This is statute 2913.42 and defendant PLD GLTY, This is statute 2913.44 without any plea of guilt, This is statute 2913.405 and defendant at pre-trial PLD GLTY"

Очевидно, вы хотите, чтобы она возвращала: ['2913.42', '2913.405'].

На момент написания есть три ответа, только один из который проходит этот тест, хотя все три из них проходят с использованием тестовой строки, указанной в вопросе.

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