Я хотел бы использовать регулярное выражение для сопоставления чисел, если подстрока присутствует, но без сопоставления подстроки. Следовательно,

2-4 foo
foo 4-6
bar 8

Должен соответствовать

2, 4
4, 6

У меня сейчас есть

(\d{0,}\.?\d{1,})

Который возвращает числа (int или float). С использованием

(\d{0,}\.?\d{1,}(?=\sfoo))

Соответствует только 4, а не 2 и 4. Я также пробовал смотреть вперед

^(?=.*?\bfoo\b)(\d{0,}\.?\d{1,})

Но это соответствует только 2.

* отредактированная опечатка

2
ScienceDan 20 Май 2021 в 14:20

1 ответ

Лучший ответ

С движками, которые поддерживают шаблоны просмотра назад бесконечной ширины, вы можете использовать

(?<=\bfoo\b.*)\d*\.?\d+|\d*\.?\d+(?=.*?\bfoo\b)

См. эту демонстрацию регулярного выражения. Соответствует любому нулю или нескольким цифрам, за которыми следует необязательная точка, а затем одна или несколько цифр, если перед ним стоит целое слово foo (не обязательно сразу) или когда за ним следует целое слово foo где-то справа .

Когда у вас есть доступ к коду, вы можете просто проверить наличие слова в тексте, а затем извлечь все совпадения. В Python вы можете использовать

if 'foo' in text:
    print(re.findall(r'\d*\.?\d+', text))
# Or, if you need to make sure the foo is a whole word:
if re.search(r'\bfoo\b', text):
    print(re.findall(r'\d*\.?\d+', text))
0
Wiktor Stribiżew 20 Май 2021 в 12:05