Регулярное выражение - как найти подгруппы в строках - PullRequest
1 голос
/ 30 марта 2011

у меня

[1] "000010004" "011120000" "002030000" "000300020" "003000020" "001000040" "000030020" "000010112"

[9] "050000000" "000000041" "001020020" "001030001" "001000130" "000000050" "000120020" "000500000"

используя grep. Я хочу найти все группы (строка внутри "" - группа), которые содержат

а. подгруппа 2,3 (означает: ... 2 ... 3 ... и ... 3 ... 2 ...)

б. подгруппа 1, 1, 1, 2 (означает: ... 1 ... 1 ... 1 ... 2 и 1 ... 1 ... 2 ... 1 ... и т. д.)

Порядок не имеет значения, но частота имеет значение. Значение а) 2 и 3 должно появиться только один раз.

спасибо за помощь

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Это можно сделать с помощью регулярного выражения с использованием lookahead, но это не очень красиво:

Например, чтобы сопоставить указанное в кавычках число, которое содержит ровно одну 2 и одну 3, вы можете сделать это (для удобства чтения используется подробное регулярное выражение):

"         # quote
(?=       # Assert that the following can be matched:
 [^\D2]*  # zero or more numbers except 2
 2        # 2
 [^\D2]*  # zero or more numbers except 2
 "        # quote
)         # End of lookahead
(?=[^\D3]*3[^\D3]*") # same for the number 3
(\d+)     # one or more digits, capture the result
"         # quote

Для точного совпадения трех 1 с и одного 2:

"         # quote
(?=       # Assert that the following can be matched:
 (?:      # Match the following group:
  [^\D1]* # zero or more numbers except 1
  1       # 1
 ){3}     # exactly three times.
 [^\D1]*  # Match zero or more numbers except 1
 "        # quote
)         # End of lookahead
(?=[^\D2]*2[^\D2]*") # as above
(\d+)     # one or more digits, capture the result
"         # quote

Я не знаю, будет ли это работать со стандартнымиgrep.

0 голосов
/ 30 марта 2011

Прежде всего, это невозможно с одним grep.

Но вы можете сделать следующее:

  1. Найти все группы (цитируемые вещи)
  2. Сделай из них наборы
  3. Сравните ваш вклад с этими наборами.

Это тривиально в awk.

0 голосов
/ 30 марта 2011

Я предполагаю, что с a. numbers 2,3 вы хотите сопоставить следующие записи входного массива

[3] "002030000"
[4] "000300020"
[5] "003000020"
[7] "000030020"

и с b. numbers 1, 1, 1,2 вы хотите сопоставить следующие записи

[2] "011120000"
[8] "000010112"

чтобы проверить частоту, вам, вероятно, понадобится регулярное выражение с lookaround. Это довольно сложно, если вообще возможно.

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