【问题标题】:Python Regex (Pattern Matching) phone number start with area code searchPython Regex(模式匹配)电话号码以区号搜索开头
【发布时间】:2019-10-22 04:54:26
【问题描述】:

我尝试编写逻辑来提取给定数据文件中以特定区号(电话号码的前 3 位)开头的电话号码。我的代码是:

import re

data = "This is the sample test data. 2247279133 224dfa7279133 dhana 5107279133 subha 123456789 "

pattern = re.compile(r"((224|510)\d{7})")
matches = pattern.findall(data)

for match in matches:
    print (match[0])

我得到的预期输出如下:

2247279133

5107279133

虽然我得到了预期的输出,但我想知道以下几点:

  1. 这是一种有效的方法吗?
  2. 是否可以将区号列表作为数组变量而不是硬编码 (224|510) 传递?
  3. 在 10 GB 的大文件中搜索此类电话号码的推荐方法是什么?

【问题讨论】:

    标签: python regex pattern-matching


    【解决方案1】:

    首先对您的正则表达式进行观察。由于您当前已指定正则表达式,您将在以下字符串中匹配 2247279133

    这是样本测试数据:1232247279133987 224dfa7279133 等

    这是你想要的吗?如果电话号码不在字符串的开头或结尾,您可能会要求电话号码在两边用空格分隔:

    pattern = re.compile(r"(?:\A|\s)((224|510)\d{7})(?=\Z|\s)")
    

    现在回答你的问题:

    1. 我的理解是,Python 中的正则表达式引擎依赖于回溯,因此不是查找电话号码的最有效方法理论上。如果您手动编码一个有限状态自动机来识别您正在寻找的特定电话号码,您可以做得更好。但这可能不会为您带来任何好处,因为这将作为解释的 Python 代码运行,而正则表达式引擎作为 C 语言代码运行。此外,您的正则表达式并不过分复杂,需要大量回溯。最后,如果您想处理在运行时提供的一系列区号,则需要在运行时构建 FSA。执行此操作的算法相当复杂,并且可能比您想要承担的任务更大。 最重要的是,您正在做的可能是您在实践中可以采取的最有效的方法

    2. 是的。传递给re.compile 的字符串可以在运行时通过调用'|'.join(area_codes) 部分创建,其中area_codes 是区号列表。

    3. 如果您对仅 Python 的性能不满意,您应该使用 Unix/Linux grep 实用程序作为第一步过滤器进行调查(不幸的是,grep 会输出包含您正在寻找的模式的整行) .

    【讨论】:

    • 感谢罗纳德的回复。我认为我的数据可能包含也可能不包含空格作为电话号码的前缀或后缀。如果有空间,我会仔细检查并采纳您的建议来实施。我将通过传递区号列表来尝试并加入他们。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2019-08-06
    • 2019-01-02
    • 2023-01-12
    相关资源
    最近更新 更多