我有以下代码:
p = re.compile(ur'(.{0,20})\b(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}(\d{4,6})\b(.{0,20})', re.IGNORECASE)
test_str = u"223-356-7890 asdasdasdas dfgdfgdf"
print re.match(p, test_str)
它匹配223-356-7890好,但当行"asdasdasdas dfgdfgdf 223-356-7890"
时,它不匹配任何东西。问题是什么?
我试过http://regex101.com/,它匹配但不在我的python中
答案 0 :(得分:0)
问题在于,在您的示例中,您在数字序列之前有21个字符:
re.match(ur"(.{0,20})\b(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}\b(.{0,20})",
"asdasdasdas dfgdfgdf 223-356-7890")
导致不匹配,但
re.match(ur"(.{0,21})\b(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}\b(.{0,20})",
"asdasdasdas dfgdfgdf 223-356-7890")
匹配。这是因为在第一个选项中最多需要20个字符才能匹配。在regex101:http://regex101.com/r/fN3zU5/27上你可以看到,对于第二个例子,第一个字符不匹配,导致python不匹配。
可能会有更灵活的解决方案
(.*?)(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}(\d{4,6})(.*)
见http://regex101.com/r/fN3zU5/28
或者如果您在找到数字序列后对剩余的字符串不感兴趣,可以使用:
(.*?)(\d{2,4})[^\d]{1,5}(\d{3,4})[^\d]{1,5}(\d{4,6})(.*?)