我正在研究一个正则表达式来查找长字符串中的波兰电话号码。可能是 +48
、0048
、48
(不在括号中),后跟 9 个数字,中间有空格。
第一个想法是:
(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}
这会捕获 +48 123 456 789
和 123456789
等内容,但也会在 1234567899876543211
中找到 2 个电话号码 - 这是 Not Acceptable 。所以我添加了单词边界:
\b(\(?(\+|00)?48\)?)?[ -]?\d{3}[ -]?\d{3}[ -]?\d{3}\b
但是这个正则表达式在诸如 (+48) 123 456 789
之类的字符串中只会捕获 48) 123 456 789
。为什么开头被省略了?
( regex101 包含应该匹配/不应该匹配的示例)
最佳答案
您的 \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
如果匹配左侧有单词字符,(?<!\w)
负后向查找将导致匹配失败;如果匹配右侧有单词字符,(?!\w)
负前向查找将导致匹配失败。
关于python - 波兰电话号码的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45281440/