【问题标题】:Python phone number regexPython 电话号码正则表达式
【发布时间】:2018-05-29 14:19:20
【问题描述】:

我需要你的帮助: 我需要在一段文本中查找所有电话号码,因此我需要匹配不同的号码格式,例如:+420 123 123 123、123 123 123、+420123123123 和/或 123123123。

如果我在搜索方法中使用正则表达式模式,它可以完美运行,但如果我使用 findall 方法,它只会返回一个空格列表。

import re

def detect_numbers(text):
    phone_regex = re.compile(r"(\+420)?(\s*)?\d{3}(\s*)?\d{3}(\s*)?\d{3}")
    print(phone_regex.findall(text))

【问题讨论】:

  • 较长的数字总是以 420 开头吗?
  • docs.python.org/3/library/re.html#re.findall Findall 返回元组列表,每个元组代表一个匹配的组。您正在对空格进行分组,但没有对实际数字进行分组。
  • 将您的组更改为非捕获组。 (?:\+420)? (?:\s*)?等等。或者捕获数字而不是空格。

标签: python regex


【解决方案1】:

https://docs.python.org/3/library/re.html#re.findall

Findall 返回元组列表,每个元组代表一次匹配的组。您正在对空格进行分组,但没有对实际数字进行分组。

尝试将数字分组的正则表达式:

r"(\+420)?(\s*)?(\d{3})(\s*)?\(d{3})(\s*)?\(d{3})"

例如

def detect_numbers(text):
    phone_regex = re.compile(r"(\+420)?\s*?(\d{3})\s*?(\d{3})\s*?(\d{3})")
    print(phone_regex.findall(text))

detect_numbers("so I need to match +420 123 123 123, also 123 123 123, also +420123123123 and also 123123123. Can y")

打印:

[('+420', '123', '123', '123'), ('', '123', '123', '123'), ('+420', '123', '123', '123'), ('', '123', '123', '123')]

然后您可以将组匹配字符串加入以获取数字,例如

def detect_numbers(text):
    phone_regex = re.compile(r"(\+420)?\s*?(\d{3})\s*?(\d{3})\s*?(\d{3})")
    groups = phone_regex.findall(text)
    for g in groups:
        print("".join(g))

detect_numbers("so I need to match +420 123 123 123, also 123 123 123, also +420123123123 and also 123123123. Can y")

打印:

+420123123123
123123123
+420123123123
123123123

【讨论】:

  • 匹配和分组是有区别的。 `r"This (is a) test"``Will match "This is a test",并且会有一个包含“is a”的子组。
【解决方案2】:

尝试下面的正则表达式以获取包含数字的手机号码

"/[^0-9 +\-]/"

如果您想从以下特定号码的用户开始

preg_match('\+420\d{9}/', mobilenumber)

【讨论】:

  • @somesh 删除集合中的 ^
  • @Oliver 是的 ^ 这个不需要
【解决方案3】:

假设您的文本表现得相对较好。然后一个简单的模式可以是恢复所有至少九位数字、空格和- 的序列,可选地以+re.findall 开头。

除非您的文本包含一些奇怪的工件或算术运算,否则这应该可以解决问题。此外,松散的格式将允许找到包含格式错误的数字。

import re

def find_phone_numbers(text):
    phones = re.findall('(?:\+ *)?\d[\d\- ]{7,}\d', text)
    return [phone.replace('-', '').replace(' ', '') for phone in phones]

例子:

text = "My phone numbers are 123123123, +234-123-3231 and + 555 123 1234"

print(find_phone_numbers(text)) # ['123123123', '+2341233231', '+5551231234']

【讨论】:

    【解决方案4】:

    这是因为findall 只返回不重叠的匹配项,而搜索返回第一个匹配项。

    findall

    返回字符串中所有不重叠的模式匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配项。

    您可以使用search,也可以将正则表达式更改为

    ^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$
    

    取自post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 2014-02-15
      • 2020-01-18
      • 2019-02-27
      • 1970-01-01
      • 2016-02-02
      • 2011-12-14
      相关资源
      最近更新 更多