Какое регулярное выражение я могу использовать для захвата групп из этой строки? - PullRequest
1 голос
/ 19 августа 2009

Допустим, следующие строки:

  • A01B100
  • A01.B100
  • A01
  • A01............................B100 (все, что между А и В)

Дело в том, что числа должны быть \d+, и во всех строках A всегда будет присутствовать, а B - нет. A всегда будет сопровождаться одной или несколькими цифрами, и B будет, если он присутствует. Какое регулярное выражение я могу использовать, чтобы получить цифры A и B?

У меня есть следующее регулярное выражение:

(A(\d+)).*?(B?(\d+)?)

но это работает только для первого и третьего случая.

Ответы [ 4 ]

3 голосов
/ 19 августа 2009
  • Должен A предшествовать B? Предполагая, что да.
  • Может ли B появляться более одного раза? Предполагая нет.
  • Может ли B появляться, кроме как в составе группы B -номер? Предполагая нет.

Тогда

A\d+.*?(B\d+)?

используя ленивых. *? или

A\d+[^B]*(B\d+)?

, который более эффективен, но требует, чтобы B был одним символом.

РЕДАКТИРОВАТЬ: После дальнейшего размышления, я заключил в скобки образцы не совсем идеальным способом. Следующие шаблоны должны потребовать меньше предположений:

A\d+(.*?B\d+)?
a\d+([^B]*B\d+)?
1 голос
/ 19 августа 2009
(?ms)^A(\d+)(?:[^\n\r]*B(\d+))?$

Предполагая одну строку на строку:

  • [^ \ n \ r] * - это не жадное совпадение для любых символов (кроме новых строк) после Axx, так как это может поглотить промежуточный Byy перед последним B:

    A01 ... B01 ... B23

будет соответствовать, с 01 и 23 обнаружены.

0 голосов
/ 19 августа 2009
import re
m = re.match(r"A(?P<d1>\d+)\.*(B(?P<d2>\d+))?", "A01.B100")
print m.groupdict()
0 голосов
/ 19 августа 2009
A\d+.*(B\d+)?

ОК, так что это обеспечивает что-то, что проходит все тестовые случаи НО у него есть несколько ложных срабатываний.

A\d+(.*B\d+)?

Кажется, что другие символы должны появляться только в том случае, если B (что угодно) следует за ними, поэтому используйте вместо этого выше.

#perl test case hackup
@array = ('A01B100', 'A01.B100', 'A01', 'A01............................B100', 'A01FAIL', 'NEVER');
for (@array) {
print "$_\n" if $_ =~ /^A\d+(.*B\d+)?$/;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...