Регулярное выражение для поиска целых чисел в скобках - PullRequest
0 голосов
/ 20 марта 2020

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

import re
a = "  afd [asd] [12 ] [a34]  [ -43 ]tt [+12]xxx"
b = "  afd [asd] [12 ] [a34]  [       -43 ]tt [+12]xxx!"
c = "  afd [128+] [47 ] [a34]  [ +-43 ]tt [+12]xxx"
from_a = re.findall(r'\[[\s+]*(-?\d+)\s*\]',a)
from_b = re.findall(r'\[[\s+]*(-?\d+)\s*\]',b)
from_c = re.findall(r'\[[\s+]*(-?\d+)\s*\]',c)

Это конкретное регулярное выражение работает для строк a и b и дает требуемый вывод. Однако в строке c, когда после двух скобок '[' или пробела следует два (+ или -) знака, регулярное выражение должно игнорировать это целое число.

РЕДАКТИРОВАТЬ

expected results
from_a = [12,-43,12]
from_b = [12,-43,12]
from_c = [47,12]

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Вы можете использовать

\[\s*(?:\+(?=\d))?(-?\d+)\s*]

См. Демоверсию regex .

Подробности

  • \[ - [ char
  • \s* - 0+ пробелов
  • (?:\+(?=\d))? - необязательный +, за которым следует ди git
  • (-?\d+) - группа 1: необязательный -, а затем 1+ цифры
  • \s* - 0+ пробелов
  • ] - ] символ.

См. Python демо :

import re
strs = ['  afd [asd] [12 ] [a34]  [ -43 ]tt [+12]xxx','  afd [asd] [12 ] [a34]  [       -43 ]tt [+12]xxx!','  afd [128+] [47 ] [a34]  [ +-43 ]tt [+12]xxx']
for s in strs:
    print( re.findall(r'\[\s*(?:\+(?=\d))?(-?\d+)\s*]', s) )

Выход:

['12', '-43', '12']
['12', '-43', '12']
['47', '12']
0 голосов
/ 20 марта 2020

+ не должно быть в скобках с \s. Это позволяет любое число + символов перед номером, которое может дополнительно начинаться с -.

. Используйте [-+]?, чтобы разрешить дополнительный знак в начале числа.

from_c = re.findall(r'\[\s*([-+]?\d+)\s*\]',c)
print(from_c)
['47', '+12']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...