Python 波兰电话号码的正则表达式

Python 波兰电话号码的正则表达式,python,regex,Python,Regex,我正在使用一个正则表达式来查找长字符串中的波兰电话号码。可能有+48,0048,48(不在括号中)后跟9位数字,中间有空格 第一个想法是: (\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3} 这会捕获诸如+48 123 456 789和123456789之类的内容,但也会在123456789876543211中找到2个电话号码-这是不可接受的。所以我添加了单词边界: \b(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3

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

第一个想法是:

(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}
这会捕获诸如
+48 123 456 789
123456789
之类的内容,但也会在
123456789876543211
中找到2个电话号码-这是不可接受的。所以我添加了单词边界:

\b(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}\b
但是这个正则表达式,比如
(+48)123 456 789
字符串,将只捕获
48)123 456 789
。为什么省略开头

(有什么应该匹配/不应该匹配的示例)

您的右侧没有匹配可选部分,因为单词边界是强制性的,而可选模式可能会丢失。例如,
+48 123 456 789
字符串(其中仅匹配了
48 123 456 789
)的问题如下:初始
\b
需要一个单词边界,而
+
之前没有单词边界,因此它继续移动并在
+
之后找到
4
,这就是单词边界所在的位置。接下来,
(+48)123 456 789
只产生了
48)123 456 789
,因为单词边界只在
+
4
之间找到

您可以直接告诉正则表达式引擎仅在字符串前面或后面没有单词字符的情况下匹配字符串,而不是使用单词边界

使用

(?
见


(?如果匹配项左侧有单词char,则负查找将使匹配失败,
(?!\w)
如果匹配右侧有一个单词char,则反向前瞻将导致匹配失败。

空格是否总是三人一组?@WillemVanOnsem我对一些错误否定表示同意,因此,我们可以做出此假设。请提供更多示例输入,并注明“应匹配”/“不应匹配”。似乎您可以添加
(?和
(?!\w)
而不是单词边界来限制匹配的上下文,请使用。我明白了。在这种情况下,我仍然不明白我的表达式为什么不起作用,但您的解决方案非常优雅地解决了问题:)嗯,我添加了一个小解释,解释为什么OP中共享的最后一个正则表达式不起作用。解释为什么在可选模式之前添加单词边界不起作用更难:重点是单词边界是必须的,而模式不是。我只能使单词边界与条件一起工作-请参见where
(…)
匹配更好一点(如果有一个
或一个
),它就不会匹配。)@Sonic Lookaheads在JS regex中已经支持很久了,你一定是指“lookbehind”。无论如何,有很多解决方法,你不需要在这里查找。只要用
(^\W)替换
(?)
。不在safari上工作!!@AndrzejDzirba这个问题与Python有关,正则表达式用于Python
re
。在JS中,您需要使用类似的替代选项。
(?<!\w)(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}(?!\w)