我正在读“用python自动处理无聊的东西”。现在,我被困在第7章(Regex部分)。有一个美国电话号码的模板,我想为乌克兰的电话号码实现它。
乌克兰数字可以以不同格式出现,如:+380445371428,+38( 044 )5371428,+38(044)537 14 28,+38(044)537-14-28,+38(044) 537-14-28,+38(044) 537.14.28,044.537.14.28,0445371428,044-537-1428,(044)537-1428,044 537-1428等等。
以下是我的实现,但并不完全正确。我需要什么?
phoneRegex = re.compile(r'''(
(^\+38?) # area code(not necessarily)
(\d{3}|\(\d{3}\)) # carrier code(usually starts with 0
(\s|-|\.)? # separator
(\d{3}|\(\d{3}\)) # first 3 digits
(\s|-|\.) # separator
(\d{4}) # last 4 digits
(\s*(ext|x|ext.)\s*(\d{2,5}))? # extension
)''', re.VERBOSE)美国数字模板(根据这本书)如下所示
phoneRegex = re.compile(r'''(
(\d{3}|\(\d{3}\))?
(\s|-|\.)
(\d{3})
(\s|-|\.)
(\d{4})
(\s*(ext|x|ext.)\s*(\d{2,5}))?
)''', re.VERBOSE)发布于 2019-10-05 20:39:06
也许,一种选择是根据我们可能拥有的模式类型合并替换,例如:
^(?:\+38)?(?:\(044\)[ .-]?[0-9]{3}[ .-]?[0-9]{2}[ .-]?[0-9]{2}|044[ .-]?[0-9]{3}[ .-]?[0-9]{2}[ .-]?[0-9]{2}|044[0-9]{7})$或者更严格的限制,如果我们能确认。
测试
import re
regex = r'^(?:\+38)?(?:\(044\)[ .-]?[0-9]{3}[ .-]?[0-9]{2}[ .-]?[0-9]{2}|044[ .-]?[0-9]{3}[ .-]?[0-9]{2}[ .-]?[0-9]{2}|044[0-9]{7})$'
string = '''
+380445371428
+38(044)5371428
+38(044)537 14 28
+38(044)537-14-28
+38(044) 537.14.28
044.537.14.28
0445371428
044-537-1428
(044)537-1428
044 537-1428
+83(044)537 14 28
088 537-1428
'''
print(re.findall(regex, string, re.M))输出
“+380445371428”、“+38(044)5371428”、“+38(044)537 14 28”、“+38(044)537-14-28”、“+38(044)537.14.28”、“044.537.14.28”、“0445371428”、“044-537-1428”、“(044)537-1428”、“044 537-1428”
如果您希望简化/修改/探索表达式,则在regex101.com的右上面板中已经解释了该表达式。如果您愿意的话,您也可以在此链接中观察它如何与一些示例输入相匹配。
RegEx电路
jex.im可视化正则表达式:

发布于 2020-03-24 09:06:47
以下是我对所有乌克兰数字的判断:
^\+?3?8?(0[\s\.-]\d{2}[\s\.-]\d{3}[\s\.-]\d{2}[\s\.-]\d{2})$这样可以:
或没有“加号”的相同
发布于 2019-10-05 18:50:11
我不熟悉python,但我认为遵循regex可以解决您的问题。
((\+38)?\(?\d{3}\)?[\s\.-]?(\d{7}|\d{3}[\s\.-]\d{2}[\s\.-]\d{2}|\d{3}-\d{4}))您可以检查它是否工作这里
https://stackoverflow.com/questions/58248441
复制相似问题