我试图创建一个读取文本文件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位数字。
答案 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)
答案 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