首页 文章

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

提问于
浏览
1

我试图创建一个读取文本文件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')

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

3 回答

  • 2

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

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

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


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

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

    大胆强调我的 . 这是relevant question .

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

    In [485]: re.findall('(?:\+[1-9]\d{0,2}[- ]?)?[1-9]\d{9}', text)
    Out[485]: ['1234567890', '+91-1234567890', '+91 5645454545']
    
  • 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
    
  • 2

    您可以使用

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

    demo看演示

相关问题