假设以下字符串:
A01B100
A01.B100
A01
A01............................B100
(A和B之间的任何内容)问题是,数字应为\d+
,并且在所有字符串A中始终存在,而B可能不存在。 A将始终跟随一个或多个数字,B也将如此存在。我可以使用什么正则表达式来捕获A和B的数字?
我有以下正则表达式:
(A(\d+)).*?(B?(\d+)?)
但这仅适用于第一种和第三种情况。
答案 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()