我可以用什么正则表达式从这个字符串中捕获组?

时间:2009-08-19 16:58:07

标签: python regex

假设以下字符串:

  • A01B100
  • A01.B100
  • A01
  • A01............................B100(A和B之间的任何内容)

问题是,数字应为\d+,并且在所有字符串A中始终存在,而B可能不存在。 A将始终跟随一个或多个数字,B也将如此存在。我可以使用什么正则表达式来捕获A和B的数字?

我有以下正则表达式:

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

但这仅适用于第一种和第三种情况。

4 个答案:

答案 0 :(得分:3)

  • 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 :(得分:1)

(?ms)^A(\d+)(?:[^\n\r]*B(\d+))?$

假设每行一个字符串:

  • [^ \ n \ r] *是Axx之后的任何字符(换行除外)的非贪婪匹配,意味着它可以在最后一个B之前吞噬中间Byy:

    ... A01 ... B01 B23

将匹配,检测到01和23。

答案 2 :(得分:0)

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+)?$/;
}

答案 3 :(得分:0)

import re
m = re.match(r"A(?P<d1>\d+)\.*(B(?P<d2>\d+))?", "A01.B100")
print m.groupdict()