Найти все символы в строке с запятой, используя регулярное выражение
Я хочу найти все '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)
>>> 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)