【问题标题】:Extracting numbers from a text file using regexp使用正则表达式从文本文件中提取数字
【发布时间】:2018-01-18 04:06:23
【问题描述】:

我正在尝试制作一个 python 脚本来读取文本文件 input.txt,然后扫描该文件中的所有电话号码并将所有匹配的电话号码写回 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 位数字。

【问题讨论】:

  • 输出文件未显示预期。它只显示 +91- 和 +91 。所以我猜想写正则表达式有问题。在开头添加 (.*?) 如何改变正则表达式的行为?
  • 所以您只需要输出文件中的电话号码,或者您也想删除重复项
  • 不,我不想删除重复项。我希望在上面运行脚本后给出文本它应该写 1234567890、+91-1234567890 和 +91 5645454545 到 output.txt 但运行脚本后它只写 +91- 和 +91
  • 使用这个正则表达式:'(?:\+[1-9]\d{0,2}[- ]?)?[1-9][0-9]{9}'

标签: python regex pattern-matching


【解决方案1】:

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

'(\+[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']

【讨论】:

  • 它在 regex101 中正常工作,但它只是将 +91- 和 +91 写入我的 output.txt 。请看我的完整代码
  • 谢谢你!有效。我花了很多时间在它上面。你能详细说明一下[需要指定一个非捕获组吗?:]
  • 我没有足够的声望来投票。谢谢回答
  • @mcjoshi 你确定吗? ;p
  • 呵呵.. 谢谢你的一切:)
【解决方案2】:

你可以使用

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

demo查看演示

【讨论】:

  • 什么意思?
  • 查看我的代码。我想说它只是将 +91 和 +91- 写入 output.txt
  • 对于 python,您还需要使用 ?: 指定一个非捕获组。否则,re.findall 不会返回完整匹配:查看更新的答案和演示
【解决方案3】:

此代码将起作用:

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

【讨论】:

  • 是的,它有效 :) 我需要再问一件事 :: 假设我的输入文本文件在两段之间包含许多换行符。如何使用正则表达式删除额外的换行符?
  • 你可以为你的问题提供一个样本吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
相关资源
最近更新 更多