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

Я хочу найти все '2' в строке ниже:

2, 10,11,1,1, 22,1,12,1,1, 1,2 , 2  ,2

Я дал регулярное выражение:

(^\s*(2)\s*)|(\s*,\s*(2)\s*(,|$))

Но это не будет искать последний, но один 2.


Я изменил регулярное выражение сейчас, как,

(^\s*(2)\s*)|(\s*,\s*(2)\s*)

Но теперь это займет одну из 2-х в 22.


Как я могу изменить регулярное выражение, чтобы найти все 2 (22 или 12 не должны рассматриваться)?

3 ответа

Решение

Это будет соответствовать всем автономным 2 во входной строке:

(?<!\d)2(?!\d)

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

(?:^|\D)(2)(?:\D|$)

Обратите внимание, что (оба) регулярное выражение выше не заботится о формате ввода. Он просто извлекает любой автономный 2, даже в:

2 plain text, 2,43_2,lkjsf
^             ^    ^

Если вы хотите сопоставить столбцы со значением 2и игнорировать 2 в 2 2 или же abc 2:

(?:^|,) *(2) *(?=,|$)

Это будет соответствовать только 2 в этом примере текста:

2 plain text, 2 ,2, 43_2, 2 2,2   ,234,2
              ^  ^            ^        ^

Используйте отрицательный взгляд назад и отрицательный взгляд вперед.

(?<!\d)2(?!\d)

DEMO

>>> import re
>>> s = "2, 10,11,1,1, 22,1,12,1,1, 1,2 , 2  ,2"
>>> re.findall(r'(?<!\d)2(?!\d)', s)
['2', '2', '2', '2']

Объяснение:

  • (?<!\d)2 Взгляд за спиной утверждает, что 2 будет предшествовать любая, но не цифра.
  • 2(?!\d) Утверждает, что за 2 должен следовать любой, кроме цифры.

Надежды это то, что вы ищете

 [^\d]2[^\d]

http://regex101.com/r/nD6nZ9/1

код Python должен быть что-то вроде

p = re.compile(ur'[^\d]2[^\d]', re.MULTILINE)
Другие вопросы по тегам