RegEx для сопоставления двух цифр и всего, кроме новых строк и точек - PullRequest
0 голосов
/ 04 мая 2019

Используя python v3, я пытаюсь найти строку, только если она содержит от одной до двух цифр (и не более того, что в том же номере) вместе со всем остальным после нее. Матч перерывается на периоды или новые строки.

\d{1,2}[^.\n]+ почти верно, за исключением того, что оно возвращает числа больше двух цифр.

Например:

"5+years {} experience. stop. 

10 asdasdas   . 255 

1abc1 

5555afasfasf++++s()(jn."

Должен вернуться:

5+years {} experience

10 asdasdas   

1abc1

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Исходя из вашего описания и ваших примеров данных, вы можете использовать следующее регулярное выражение для сопоставления предполагаемых строк и отбрасывания других,

^\d[^\d.]*\d?[^\d.\n]*(?=\.|$)

Regex Объяснение:

  • ^ - начало строки
  • \d - соответствует цифре
  • [^\d.]* - соответствует любому символу, кроме цифры или ноля или более раз. Это в основном позволяет опционально сопоставлять нецифровые не точечные символы.
  • \d? - Если вы хотите разрешить одну или две цифры, это вторая цифра, которая является необязательной, поэтому \d, за которой следует ?
  • [^\d.\n]* - соответствует любому символу, кроме цифры, точки или новой строки
  • (?=\.|$) - Этот позитивный взгляд вперед гарантирует, что совпадение заканчивается либо точкой, либо концом линии

Также обратите внимание, что многострочный режим включен, так как ^ и $ должны соответствовать началу строки и концу строки .ad

Regex Demo 1

Код:

import re

s = '''5+years {} experience. stop.

10 asdasdas . 255

1abc1

5555afasfasf++++s()(2jn.'''

print(re.findall(r'(?m)^\d[^\d.]*\d?[^\d.\n]*(?=\.|$)', s))

Печать:

['5+years {} experience', '10 asdasdas ', '1abc1']

Кроме того, если совпадающие строки не обязательно начинаются с цифр, вы можете использовать это регулярное выражение для захвата вашей предполагаемой строки, но здесь вам нужно получить вашу строку из group1, если вы хотите, чтобы захваченная строка начиналась только с цифры, и, если она предназначена Строка не обязательно должна начинаться с цифры, тогда вы можете захватить все совпадение.

^[^\d\n]*(\d[^\d.]*\d?[^\d.\n]*)(?=\.|$)

Regex Объяснение:

  • ^ - начало строки
  • [^\d\n]* - допускает ноль или более нецифровых символов перед первой цифрой
  • ( - запускает первый шаблон группировки для захвата строки, начиная с первой цифры
  • \d - соответствует цифре
  • [^\d.]* - соответствует любому символу, кроме цифры или ноля или более раз. Это в основном позволяет опционально сопоставлять нецифровые не точечные символы.
  • \d? - Если вы хотите разрешить одну или две цифры, это вторая цифра, которая является необязательной, поэтому \d, за которой следует ?
  • [^\d.\n]* - соответствует любому символу, кроме цифры, точки или новой строки
  • `) - Конец первого шаблона захвата
  • (?=\.|$) - Этот положительный взгляд вперед гарантирует, что совпадение заканчивается либо точкой, либо концом линии

Включен многострочный режим, который можно включить, поместив (?m) перед началом регулярного выражения, также называемого встроенным модификатором, или передав третий аргумент re.search как re.MULTILINE

Regex Demo 2

Код:

import re

s = '''5+years {} experience. stop.

10 asdasdas . 255

1abc1

aaa1abc1

aa2aa1abc1

5555afasfasf++++s()(2jn.'''

print(re.findall(r'(?m)^[^\d\n]*(\d[^\d.]*\d?[^\d.\n]*)(?=\.|$)', s))

Печать:

['5+years {} experience', '10 asdasdas ', '1abc1', '1abc1']
0 голосов
/ 04 мая 2019

Что-то вроде этого делает то, что вы ищете:

^(\"|\'|)\d{1,2}\D[^.\n]+

Применимо к этому:

"5+years {} experience. stop. 

10 asdasdas   . 255 

1abc1 

512abcd

5555afasfasf++++s()(2jn."

Возвращает:

"5+years {} experience

10 asdasdas   

1abc1 

Regex Demo

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