Регулярное выражение для выбора фразы, начинающейся с токенов, содержащих цифры - PullRequest
1 голос
/ 21 июня 2020

У меня есть такие тексты, как этот:

text = 'this is a sentence, it has 1 number in it, and another one 123 here. we want to select n8m3r1c-aa words and phrases - until the punctuation. this is some phr4se!1 with text.'

Моя цель - выбрать фрагменты, начиная с любого токена / слова, в котором есть di git и пробел перед ним. Выбор должен происходить до следующей найденной пунктуации, но не до знаков препинания внутри токена.

Ожидаемый результат:

1 number in it
123 here
n8m3r1c-aa words and phrases
phr4se!1 with text

Мой текущий подход:

re.findall(r'\s(\d.+?)[.,!]', text)

Но это находит только:

1 number in it
123 here

Я немного застрял, начиная выбор с токенов, которые не только начинаются с di git, но также содержат di git. Буду признателен за любую помощь и предложения!

1 Ответ

3 голосов
/ 21 июня 2020

Шаблон, который вы пробовали, получает 2 совпадения, потому что он начинается с \s(\d, что означает, что он должен начинаться с di git.

Вы можете использовать [^\s\d]*\d\S* для сопоставления необязательных пробельных символов до первого di git и при необходимости сопоставить следующие символы без пробелов.

(?<!\S)[^\s\d]*\d\S*.*?(?=[.,!-])

По частям

  • (?<!\S) Утвердить границу пробела слева
  • [^\s\d]* Соответствует любому символу, кроме символа пробела или di git
  • \d Соответствует di git
  • \S* Соответствует 0+ раз непробельному символу (остальная часть «слова»)
  • .*? Соответствует любому символу, кроме символа новой строки, как минимум
  • (?=[.,!-]) Положительный просмотр вперед, утверждение, что справа - любой из перечисленные символы

Regex demo

Если в начале должен быть пробельный символ, вы также можете использовать группу захвата и сопоставить то, что предшествует и следует:

\s([^\s\d]*\d\S*.*?)[.,!-]

Демо Regex

...