使用regexp从文本文件中提取数字

时间:2017-08-10 04:48:26

标签: python regex pattern-matching

我试图创建一个读取文本文件input.txt的python脚本,然后扫描该文件中的所有电话号码并将所有匹配的电话号码写回output.txt

让我们说文本文件就像:

  

嘿,我的号码是1234567890,另一个号码是+ 91-1234567890。但如果没有这些可用,你可以致电+91 5645454545(或)发送电子邮件至abc@xyz.com

它应匹配 1234567890 + 91-1234567890 +91 5645454545

import re

no = '^(\+[1-9]\d{0,2}[- ]?)?[1-9][0-9]{9}' #i think problem is here
f2 = open('output.txt','w+')

for line in open('input.txt'):
    out = re.findall(no,line)
    for i in out : 
        f2.write(i + '\n')

Re的正则表达式是:它需要国家代码最多3位数,然后是 - 或空格是可选的,国家代码本身是可选的,然后是10位数字。

3 个答案:

答案 0 :(得分:2)

是的,问题在于你的正则表达式。幸运的是,它很小。您只需要删除^字符:

'(\+[1-9]\d{0,2}[- ]?)?[1-9]\d{9}'

^表示您只想在字符串的开头匹配。您希望在整个字符串中多次匹配。这是一个101demo

对于python,您还需要使用?:指定非捕获组。否则,re.findall不会返回完整匹配:

  

返回字符串中所有非重叠的模式匹配,作为列表   字符串。从左到右扫描字符串,并返回匹配项   按顺序找到。 如果模式中存在一个或多个组,   返回组列表。

大胆强调我的。这是一个relevant question

这是您为问题指定非捕获组时所获得的:

In [485]: re.findall('(?:\+[1-9]\d{0,2}[- ]?)?[1-9]\d{9}', text)
Out[485]: ['1234567890', '+91-1234567890', '+91 5645454545']

答案 1 :(得分:2)

你可以使用

(?:\+[1-9]\d{1,2}-?)?\s?[1-9][0-9]{9}

请参阅demo

上的演示

答案 2 :(得分:2)

此代码将起作用:

import re

no = '(?:\+[1-9]\d{0,2}[- ]?)?[1-9][0-9]{9}' #i think problem is here
f2 = open('output.txt','w+')

for line in open('input.txt'):
    out = re.findall(no,line)
    for i in out :
        f2.write(i + '\n')

输出将是:

1234567890
+91-1234567890
+91 5645454545