Nano Hash - криптовалюты, майнинг, программирование

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

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

  • ХХХ/Х{3,6}
  • ХХХ.Х{3,6}
  • ХХХ.Х{3,6}/ХХХ

С X число от 0 до 9.

Регулярное выражение должно быть достаточно сильным, чтобы мы не извлекали коды, находящиеся в другой строке. Использование границ слов было моей первой идеей. Регулярное выражение выглядит так: \b\d{3}[\.\/]\d{3,6}(?:\/\d{3})?\b

Проблема с границами слов заключается в том, что они также соответствуют точкам. Таким образом, номер типа 123/456.12 будет соответствовать 123/456 в качестве номера клиента. Итак, я придумал следующее регулярное выражение: (?<!\S)\d{3}[\.\/]\d{3,6}(?:\/\d{3})?(?!\S). Он использует просмотр назад и просмотр вперед и проверяет, является ли этот символ пробелом. Это правильно соответствует большинству клиентских кодов.

Но есть еще одна последняя проблема. Мы используем текст Google OCR для извлечения кодов. Это означает, что допустимый код может быть найден в тексте, таком как 123/456\n, \n123/456, \n123/456\n и т. д. Проверка того, являются ли предыдущий и/или следующий символы пробелами, не работает, потому что литерал \n не включен в это. Если я делаю что-то вроде (?<!\S|\\n) в качестве границы слова, по какой-то причине он также включает обратную и/или прямую косую черту. В настоящее время я придумал следующее регулярное выражение (?<![^\r\n\t\f\v n])\d{3}[\.\/]\d{3,6}(?:\/\d{3})?(?![^\r\n\t\f\v \\]), но оно проверяет только, является ли предыдущий символ n или пробелом, а следующий - обратной косой чертой или пробелом. Таким образом, такие строки, как lorem\123/456, все равно найдут совпадение. Мне нужен какой-то способ включить \n в символы пробела, не нарушая просмотр вперед/просмотр назад.

Ребята, у вас есть идеи, как решить эту проблему? Все входные данные приветствуются. Спасибо!


  • Итак, во-первых, я рекомендую преобразовать строку в необработанную строку, например stackoverflow.com/questions/4415259/ 31.05.2021
  • Мы не можем этого сделать, потому что мы пометили данные, которые используют индексы строки как объект Span. Поэтому, если мы приведем к необработанной строке, помеченные данные больше не будут действительными. Рефакторинг помеченных данных также не вариант. 31.05.2021
  • Как работает ^(\\n){0,1}[0-9]{3}\/[0-9]{3,6}(\\n){0,1}$? Таким образом, строка может содержать или не содержать символ новой строки в начале и/или в конце, но определенно больше ничего впереди или после? 31.05.2021
  • Я думаю, это должно сработать: ^(\\n){0,1}[0-9]{3}\/[0-9]{3,6}(\/[0-9]{3}){0,1}(\\n){0,1}$ 31.05.2021

Ответы:


1

Кажется, вы хотите вычесть \n из границ пробелов. Ты можешь использовать

re.findall(r'(?<![^\s\n])\d{3}[./]\d{3,6}(?:/\d{3})?(?![^\s\n])', text)

См. демонстрацию Python и эта демонстрация регулярного выражения.

Если \n представляет собой комбинацию символов \ и n, необходимо убедиться, что \S в поиске не соответствует следующим:

import re
text = r'Codes like 123/456\n \n123/3456 \n123/23456\n etc are correct \n333.3333/333\n'
print( re.findall(r'(?<!\S(?<!\\n))\d{3}[./]\d{3,6}(?:/\d{3})?(?!(?!\\n)\S)', text) )
# => ['123/456', '123/3456', '123/23456', '333.3333/333']

См. эту демонстрацию Python.

Подробности:

  • (?<![^\s\n]) - отрицательный просмотр назад, который соответствует местоположению, которому не предшествует непосредственно символ, отличный от пробела и символа LF.
  • (?<!\S(?<!\\n)) - левая граница пробела, которая не срабатывает, если непробельным является n из комбинации символов \n
  • \d{3} - три цифры
  • [./] - a . or /
  • \d{3,6} - от трех до шести цифр
  • (?:/\d{3})? - необязательная последовательность из / и трех цифр
  • (?![^\s\n]) - отрицательный просмотр вперед, который не требует никаких символов, кроме пробела и LF сразу справа от текущего местоположения.
  • (?!(?!\\n)\S) — правая граница пробела, которая не срабатывает, если непробельным является символ \, за которым следует n.
31.05.2021
  • Спасибо, но это все равно не будет соответствовать, если строка выглядит так: \n333.3333/333\n. Помните, что \n здесь буквальный текст. 31.05.2021
  • @Ian Смотрите обновленный ответ. 31.05.2021
  • Использование просмотра вперед/назад внутри другого, чтобы включить \n, похоже, работает! Спасибо 31.05.2021
  • @Ian Да, потому что они используются для ограничения шаблона \S внутри внешних обходов. Внешние обходные пути ограничивают контекст соответствия \d{3}[./]\d{3,6}(?:/\d{3})?. 31.05.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..