Regex для получения любых чисел после появления строки в строке - PullRequest
1 голос
/ 28 февраля 2020

Привет, ребята, я пытаюсь получить подстроку, а также соответствующий номер из этой строки

text = "Молоко для употребления в пищу человеку можно брать только от крупного рогатого скота через 80 часов после последней обработки."

Я хочу выбрать слово «молоко» и соответствующее число 80 из этого предложения. Это часть файла большего размера, и я хочу, чтобы стандартное c решение получило слово milk в строке, а затем первое число , которое появляется после этого слова в любом месте этой строки .

(Milk+)\d

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

Редактировать: я ищу, чтобы получить как слово, так и число, если это возможно, например: "milk" "80" и использование python

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Кажется, это работает в java (я упустил из виду, что спрашивающий хотел python или вопрос был позже отредактирован), как вы хотите:

String example =
    "Test 40\n" +
    "Test Test milk for human consumption may be taken only from cattle from hours after the last treatment." +
    "\nTest Milk for human consumption may be taken only from cattle from 80 hours after the last treatment." +
    "\nTest miLk for human consumption may be taken only from cattle from 80 hours after the last treatment.";

Matcher m = Pattern.compile("((?i)(milk).*?(\\d+).*\n?)+").matcher(example);
m.find();
System.out.print(m.group(2) + m.group(3));

Посмотрите, как оно проверяет, является ли слово «молоко» появляется без учета регистра в любом месте перед числом в той же строке и печатает их оба. Он также печатает только первый найденный случай (сделать так, чтобы найти все события также можно довольно легко, просто с помощью небольших модификаций данного кода). в смысле вашей задачи.

1 голос
/ 29 февраля 2020
/(?<!\p{L})([Mm]ilk)(?!p{L})\D*(\d+)/

Соответствует следующим строкам с указанием совпадения и содержимого двух отмеченных групп захвата.

"The Milk99"             # "Milk99"     1:"Milk" 2:"99" 
"The milk99 is white"    # "milk99"     1:"milk" 2:"99"
"The 8 milk is 99"       # "milk is 99" 1:"milk" 2:"99"
"The 8milk is 45 or 73"  # "milk is 45" 1:"milk" 2:"45"

Следующие строки не совпадают.

"The Milk is white"
"The OJ is 99"
"The milkman is 37"
"Buttermilk is 99"
"MILK is 99"

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

/
(?<!\p{L}) # the following match is not preceded by a Unicode letter
([Mm]ilk)  # match 'M' or 'm' followed by 'ilk' in capture group 2
(?!p{L})   # the preceding match is not followed by a Unicode letter
\D*        # match zero or more characters other than digits
(\d+)      # match one or more digits in capture group 2 
/x         # free-spacing regex definition mode

\D* можно заменить на .*?, ?, сопоставляя нежадным. Если бы использовался жадный вариант (.*), вторая группа захвата для "The 8milk is 45 or 73" содержала бы "3".

Чтобы соответствовать «MILK is 99», измените ([Mm]ilk) на (?i)(milk).

0 голосов
/ 28 февраля 2020

Вы должны попробовать это

(Milk).*?(\d+)

В зависимости от вашего языка, вы также можете указать поиск без учета регистра. Пример в JS: /(Milk).*?(\d+)/i, окончательный i делает регистр поиска нечувствительным.

Обратите внимание на *?, самую важную часть! Это ленивая итерация. Другими словами, он читает любой символ, но как только он может остановиться и успешно обработать следующую инструкцию, он делает это. Здесь, как только вы сможете прочитать ди git, вы прочитаете его. Простой * возвратил бы последнее число из этой строки после Milk вместо

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