正常表达波兰语电话号码

时间:2017-07-24 13:05:29

标签: python regex

我正在使用正则表达式来查找长字符串中的波兰语电话号码。可能有+48004848(在括号中没有)后跟9位数字,中间有空格。

第一个想法是:

(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}

这会捕获+48 123 456 789123456789之类的内容,但也会在1234567899876543211中找到2个电话号码 - 这是不可接受的。所以我添加了单词边界:

\b(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}\b

但是这个正则表达式,在(+48) 123 456 789这样的字符串中只会捕获48) 123 456 789。为什么开头省略了?

regex101以及应匹配/不匹配的示例)

1 个答案:

答案 0 :(得分:3)

您的\b(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}\b regex与可选部分不匹配,因为字边界是强制性的,而可选图案可能会丢失。例如。 +48 123 456 789字符串(仅匹配48 123 456 789)的问题如下:初始\b需要字边界,+之前没有字边界,因此它继续前进并在4之后找到+ - 这就是单词边界所在的位置。接下来,(+48) 123 456 789仅产生48) 123 456 789,因为仅在+4之间找到了单词边界。

您可以直接告诉正则表达式引擎只匹配字符串(如果它们之前没有字符串,也不跟单词字符串匹配),而不是使用单词边界。

使用

(?<!\w)(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}(?!\w)

请参阅regex demo

如果匹配项左侧有一个单词char,则(?<!\w)否定后瞻将使匹配失败,如果在右侧有一个单词char,则(?!\w)否定前瞻将使匹配失败比赛。