Python 正则表达式:验证来自德国和奥地利的手机号码
Python regex: validate mobile numbers from Germany and Austria
我研究了一个匹配德国和奥地利手机号码的正则表达式。我无法完成它。
这是我目前拥有的:
[^\d]((\+49|0049|0|\+43|0043)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)
你可以在我的regex-demo中查看性能。
- 德国的国际区号以
+49
开头,奥地利的国际区号以 +43
开头。这包含在我的正则表达式中。
- 手机号码的长度因您输入 phone 号码的方式而异。我收集了多个示例 demo.
问题:如何改进正则表达式以匹配我的演示的所有示例?
此外,我想检查特定数字是否与定义的正则表达式匹配。
然而,我的方法并不奏效:
import re
slot_value = "0176 48200179"
regex_mobile = r"[^\d]((\+49|0049|0|\+43|0043)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)"
match = re.fullmatch(regex_mobile, slot_value)
print(match)
>>> None
如果要匹配所有号码,当:
- 德国号码是:+49、0049、+(49)
- 奥地利号码为:+43、0043、+(43)
您的正则表达式将是:
.*(?:\+49|0049|\+\(49\)|\+43|0043|\+\(43\)).*
您可以使用 finditer 来查找所有数字。
下面举例:
import re
regex = r".*(?:\+49|0049|\+\(49\)|\+43|0043|\+\(43\)).*"
test_str = ("################################### This is allowed ##########################\n"
"+49 15207930698\n"
"+49 15207955279\n"
"+49 1739341284\n"
"+49 1626589266\n\n"
"+49915175461907\n"
"+4915207930698\n"
"+491635556416\n"
"017687400179\n"
"015903900297\n"
"015175355164\n"
"015175354885\n"
"01771789427\n\n"
"+49 915175461907\n"
"+43 915175461907\n"
"+49159039012341\n"
"+43159039012341\n"
"+4915207829969\n"
"+4917697400179\n"
"+4915903904567\n"
"+4915902944599\n"
"+4915902944599\n"
"+4915903904567\n"
"+491739341284\n"
"+431739341284\n\n"
"+49 176 97 456 123\n"
"0176 79 123 17 9\n"
"0176 97 50 01 79\n"
"0176 79 123 179\n"
"0174 80123179\n\n"
"0049 915175461907\n"
"0043 915175461907\n"
"0049159039012341\n"
"0043159039012341\n"
"004915207829969\n\n"
"(+49) 17697123456\n"
"+(49) (1739) 34 12 84\n"
"+49 (1739) 34-12-84\n\n"
"############################################################################################\n"
"################################### This is NOT allowed ####################################\n"
"012345678901234\n"
"123w345345345345\n"
"0123456789101191919\n\n"
"### Too short\n"
"+49 15902\n"
"+49 1590123\n"
"+49 15903567\n"
"+49 177178796\n"
"+49 757130309\n\n"
"+4915902\n"
"+491590123\n"
"+4915903567\n"
"+49177178796\n"
"+49757130309\n\n"
"### Too long\n"
"+49 1590345985412\n"
"+491590345985412\n\n"
"### Not German and not Austrain format\n"
"+12127319863\n"
"+13322014056\n"
"+12126712234\n"
"+427532697710\n"
"+417868150810\n"
"+287533002875\n")
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
一个选项可以是在将模式的第一部分与 +
和括号的变体匹配后断言 10-12 位数字。
请注意,您可以将 (1|9)
写为 [19]
,如果不需要捕获组值,则可以省略括号,并且在模式的开头也可以缩短使用字符 class 以及 4[39]|004[39]
的替代方案
我用锚 ^
开始了模式,因为你的模式以 [^\d]
开始,实际上消耗了一个字符。
^(?:\+4[39]|004[39]|0|\+\(49\)|\(\+49\))\s?(?=(?:[^\d\n]*\d){10,12}(?!\d))(\()?[19][1567]\d{1,2}(?(1)\))\s?\d(?:[ /-]?\d)+
我研究了一个匹配德国和奥地利手机号码的正则表达式。我无法完成它。
这是我目前拥有的:
[^\d]((\+49|0049|0|\+43|0043)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)
你可以在我的regex-demo中查看性能。
- 德国的国际区号以
+49
开头,奥地利的国际区号以+43
开头。这包含在我的正则表达式中。 - 手机号码的长度因您输入 phone 号码的方式而异。我收集了多个示例 demo.
问题:如何改进正则表达式以匹配我的演示的所有示例?
此外,我想检查特定数字是否与定义的正则表达式匹配。 然而,我的方法并不奏效:
import re
slot_value = "0176 48200179"
regex_mobile = r"[^\d]((\+49|0049|0|\+43|0043)\s?(1|9)[1567]\d{1,2}([ \-/]*\d){7,8})(?!\d)"
match = re.fullmatch(regex_mobile, slot_value)
print(match)
>>> None
如果要匹配所有号码,当:
- 德国号码是:+49、0049、+(49)
- 奥地利号码为:+43、0043、+(43)
您的正则表达式将是:
.*(?:\+49|0049|\+\(49\)|\+43|0043|\+\(43\)).*
您可以使用 finditer 来查找所有数字。
下面举例:
import re
regex = r".*(?:\+49|0049|\+\(49\)|\+43|0043|\+\(43\)).*"
test_str = ("################################### This is allowed ##########################\n"
"+49 15207930698\n"
"+49 15207955279\n"
"+49 1739341284\n"
"+49 1626589266\n\n"
"+49915175461907\n"
"+4915207930698\n"
"+491635556416\n"
"017687400179\n"
"015903900297\n"
"015175355164\n"
"015175354885\n"
"01771789427\n\n"
"+49 915175461907\n"
"+43 915175461907\n"
"+49159039012341\n"
"+43159039012341\n"
"+4915207829969\n"
"+4917697400179\n"
"+4915903904567\n"
"+4915902944599\n"
"+4915902944599\n"
"+4915903904567\n"
"+491739341284\n"
"+431739341284\n\n"
"+49 176 97 456 123\n"
"0176 79 123 17 9\n"
"0176 97 50 01 79\n"
"0176 79 123 179\n"
"0174 80123179\n\n"
"0049 915175461907\n"
"0043 915175461907\n"
"0049159039012341\n"
"0043159039012341\n"
"004915207829969\n\n"
"(+49) 17697123456\n"
"+(49) (1739) 34 12 84\n"
"+49 (1739) 34-12-84\n\n"
"############################################################################################\n"
"################################### This is NOT allowed ####################################\n"
"012345678901234\n"
"123w345345345345\n"
"0123456789101191919\n\n"
"### Too short\n"
"+49 15902\n"
"+49 1590123\n"
"+49 15903567\n"
"+49 177178796\n"
"+49 757130309\n\n"
"+4915902\n"
"+491590123\n"
"+4915903567\n"
"+49177178796\n"
"+49757130309\n\n"
"### Too long\n"
"+49 1590345985412\n"
"+491590345985412\n\n"
"### Not German and not Austrain format\n"
"+12127319863\n"
"+13322014056\n"
"+12126712234\n"
"+427532697710\n"
"+417868150810\n"
"+287533002875\n")
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
一个选项可以是在将模式的第一部分与 +
和括号的变体匹配后断言 10-12 位数字。
请注意,您可以将 (1|9)
写为 [19]
,如果不需要捕获组值,则可以省略括号,并且在模式的开头也可以缩短使用字符 class 以及 4[39]|004[39]
我用锚 ^
开始了模式,因为你的模式以 [^\d]
开始,实际上消耗了一个字符。
^(?:\+4[39]|004[39]|0|\+\(49\)|\(\+49\))\s?(?=(?:[^\d\n]*\d){10,12}(?!\d))(\()?[19][1567]\d{1,2}(?(1)\))\s?\d(?:[ /-]?\d)+