使用正则表达式从 python 中的自由格式文本中提取 phone 数字
Extracting phone numbers from a free form text in python by using regex
我必须从自由形式的文本中提取 phone 个数字。
如何在 python 中使用正则表达式来管理它?
我找到了一个用于提取电子邮件地址的。 https://gist.github.com/dideler/5219706
我通过使用 phone 数字正则表达式而不是电子邮件地址正则表达式实现了相同的方法,但我无法获得输出。
def get_phoneNumber(text):
phone_number = ""
regex = re.compile("((\(\d{3,4}\)|\d{3,4}-)\d{4,9}(-\d{1,5}|\d{0}))|(\d{4,12})")
for phoneNumber in get_phoneNumbers(text, regex):
phone_number = phone_number + phoneNumber + "\n"
return phone_Number
def get_phoneNumbers(s, regex):
return (phoneNumber[0] for phoneNumber in re.findall(regex, s)
我怎样才能做到?
此正则表达式匹配来自北美的典型 phone 号码
匹配 3334445555、333.444.5555、333-444-5555、333 444 5555、(333) 444 5555 及其所有组合,例如 333 4445555、(333)4445555 或 333444-5555。
不匹配国际符号+13334445555,但匹配+1 333 4445555中的国内部分。
\(?\b[2-9][0-9]{2}\)?[-. ]?[2-9][0-9]{2}[-. ]?[0-9]{4}\b
来源:RegexBuddy
以下 Python 代码遍历所有匹配项
for match in re.finditer(r"\(?\b[2-9][0-9]{2}\)?[-. ]?[2-9][0-9]{2}[-. ]?[0-9]{4}\b", subject):
# match start: match.start()
# match end (exclusive): match.end()
# matched text: match.group()
您期待什么样的模式?
您必须构建一个模式才能将其与正则表达式匹配。
问题是您要查找的格式是什么?
要做到这一点,您应该研究 use-cases phone 数字的显示方式。
所以我希望您通过匹配 phone 个数字来定义您的意思。
- 它是否是您正在寻找的特定格式,始终与自由文本保持一致?
- 或者您可以通过国家代码 (+xx) 和特定位数来定义具有匹配 phone 数字的模式的字符串吗?
我的意思是两者之间存在巨大差异:
- 我想匹配来自任何国家、手机或固定电话、任何格式的文本中的 phone 数字,其中包含随机 space 和 (,) 字符
要么
- 我想用 +xx(space)xxxxxxx(space) 格式匹配来自匈牙利的 phone 号码,这始终是一致的。
总结:
为了能够使用正则表达式构建模式并使用它来匹配文本中的所有 phone 数字,您必须了解不同的表示形式,这意味着您期望 phone 数字看起来像什么像。如果您的模式不正确,您可能会错过很多 phone 个数字。
希望这段代码能起到很好的作用,
V
所以我想我明白了你的问题。
这是我要按顺序执行的操作:
- 了解什么是 reg-ex,如果没有基础知识,您只是在浪费我们和您自己的时间。
- 看这个:https://www.youtube.com/watch?v=ZdDOauFIDkw
- 写下你不知道的东西
- 研究
- 编写代码,为您的代码提供示例输入,将其复制到 http://pastebin.com,如果仍然无法正常工作,请展示给我们。
- 重复。
这应该会找到给定字符串中的所有 phone 号码,包括国际号码。以@buckley 为例,让我们使用字符串
text="""Matches 3334445555, 333.444.5555, 333-444-5555, 333 444 5555, (333) 444 5555 and all combinations thereof, like 333 4445555, (333)4445555 or 333444-5555. Does not match international notation +13334445555, but matches domestic part in +1 333 4445555."""
re.findall(r'+?(?[1-9][0-9 .-()]{8,}[0-9]', 文本)
>>> re.findall(r'[\+\(]?[1-9][0-9 .\-\(\)]{8,}[0-9]', text)
['3334445555', '333.444.5555', '333-444-5555', '333 444 5555',
'(333) 444 5555', '333 4445555', '(333)4445555', '333444-5555',
'+13334445555', '+1 333 4445555']
基本上,正则表达式列出了这些规则
- 匹配的字符串可以以+或(符号开头
- 后面必须跟一个 1-9 之间的数字
- 它必须以 0-9 之间的数字结尾
- 中间可能包含0-9(space).-()
我必须从自由形式的文本中提取 phone 个数字。
如何在 python 中使用正则表达式来管理它?
我找到了一个用于提取电子邮件地址的。 https://gist.github.com/dideler/5219706
我通过使用 phone 数字正则表达式而不是电子邮件地址正则表达式实现了相同的方法,但我无法获得输出。
def get_phoneNumber(text):
phone_number = ""
regex = re.compile("((\(\d{3,4}\)|\d{3,4}-)\d{4,9}(-\d{1,5}|\d{0}))|(\d{4,12})")
for phoneNumber in get_phoneNumbers(text, regex):
phone_number = phone_number + phoneNumber + "\n"
return phone_Number
def get_phoneNumbers(s, regex):
return (phoneNumber[0] for phoneNumber in re.findall(regex, s)
我怎样才能做到?
此正则表达式匹配来自北美的典型 phone 号码
匹配 3334445555、333.444.5555、333-444-5555、333 444 5555、(333) 444 5555 及其所有组合,例如 333 4445555、(333)4445555 或 333444-5555。 不匹配国际符号+13334445555,但匹配+1 333 4445555中的国内部分。
\(?\b[2-9][0-9]{2}\)?[-. ]?[2-9][0-9]{2}[-. ]?[0-9]{4}\b
来源:RegexBuddy
以下 Python 代码遍历所有匹配项
for match in re.finditer(r"\(?\b[2-9][0-9]{2}\)?[-. ]?[2-9][0-9]{2}[-. ]?[0-9]{4}\b", subject):
# match start: match.start()
# match end (exclusive): match.end()
# matched text: match.group()
您期待什么样的模式?
您必须构建一个模式才能将其与正则表达式匹配。 问题是您要查找的格式是什么?
要做到这一点,您应该研究 use-cases phone 数字的显示方式。
所以我希望您通过匹配 phone 个数字来定义您的意思。
- 它是否是您正在寻找的特定格式,始终与自由文本保持一致?
- 或者您可以通过国家代码 (+xx) 和特定位数来定义具有匹配 phone 数字的模式的字符串吗?
我的意思是两者之间存在巨大差异: - 我想匹配来自任何国家、手机或固定电话、任何格式的文本中的 phone 数字,其中包含随机 space 和 (,) 字符 要么 - 我想用 +xx(space)xxxxxxx(space) 格式匹配来自匈牙利的 phone 号码,这始终是一致的。
总结: 为了能够使用正则表达式构建模式并使用它来匹配文本中的所有 phone 数字,您必须了解不同的表示形式,这意味着您期望 phone 数字看起来像什么像。如果您的模式不正确,您可能会错过很多 phone 个数字。
希望这段代码能起到很好的作用, V
所以我想我明白了你的问题。
这是我要按顺序执行的操作:
- 了解什么是 reg-ex,如果没有基础知识,您只是在浪费我们和您自己的时间。
- 看这个:https://www.youtube.com/watch?v=ZdDOauFIDkw
- 写下你不知道的东西
- 研究
- 编写代码,为您的代码提供示例输入,将其复制到 http://pastebin.com,如果仍然无法正常工作,请展示给我们。
- 重复。
这应该会找到给定字符串中的所有 phone 号码,包括国际号码。以@buckley 为例,让我们使用字符串
text="""Matches 3334445555, 333.444.5555, 333-444-5555, 333 444 5555, (333) 444 5555 and all combinations thereof, like 333 4445555, (333)4445555 or 333444-5555. Does not match international notation +13334445555, but matches domestic part in +1 333 4445555."""
re.findall(r'+?(?[1-9][0-9 .-()]{8,}[0-9]', 文本)
>>> re.findall(r'[\+\(]?[1-9][0-9 .\-\(\)]{8,}[0-9]', text)
['3334445555', '333.444.5555', '333-444-5555', '333 444 5555',
'(333) 444 5555', '333 4445555', '(333)4445555', '333444-5555',
'+13334445555', '+1 333 4445555']
基本上,正则表达式列出了这些规则
- 匹配的字符串可以以+或(符号开头
- 后面必须跟一个 1-9 之间的数字
- 它必须以 0-9 之间的数字结尾
- 中间可能包含0-9(space).-()