2016-06-08 102 views
1

我只有一个月进入python,这个基本的练习让我走上了墙。我正在尝试制作一个搜索脚本,用于搜索我输入的文本并将结果放在剪贴板上。我被困在下面约一个星期。如果我直接从站点复制文本并输入它,没有结果(我得到一个None输出)。但如果我直接复制数字,没有问题,它完美地读取它们。我已经尝试了几种方法(如下所示),没有运气,它让我难住了。下面是我粘贴的示例文本,它没有给出结果:正则表达式返回无(python)

Dr。有人垃圾邮件

房:BLD-2001

+353(0)11 123456

任何输入的人可以提供将是巨大的。另外一个侧面的问题,任何有关学习python的书籍/建议都会很棒。目前在“使用python自动化无聊的东西”。只是为了好玩。提前致谢。

import re, pyperclip 

def findphone(numbers): 
    numregex = re.compile(r'\(\d\)\d\d\s\d+') 
    numregex1 = re.compile(r'(0)11 123456') 
    phoneRegex = re.compile(r'''(
    (\+\d{3})?     # area code 
    (\s|-|\.)?     # separator 
    (\d{3}|\(\d\)\d\d)?   # area code 
    (\s|-|\.)?     # separator 
    \d{6}       # Landline Number 
    )''', re.VERBOSE) 
    mo = numregex.search(numbers) 
    mo0 = numregex1.search(numbers) 
    mo1 = phoneRegex.search(numbers) 
    print('mo ' +str(mo)) 
    print('mo0 ' +str(mo0)) 
    print('mo1 ' +str(mo1)) 

print('Input check text') 
numbers = input() 
findphone(numbers) 
+0

我不“直接从一个网站,并输入它复制文本”与理解之间的区别“直接在号码拷贝。”另外,你可能会发现这很有用:https://regex101.com/#python –

+1

对不起约翰,没有在这一行中正确解释自己。练习的目标是输入一个大字符串,对它进行排序,并使用pyperclip将结果输出到剪贴板。艾伦下面让我走上了良好的轨道。我正在用你给我发送的正则表达式链接解构他的编辑,让我充分了解它。太感谢了! – David

回答

1

看到改变直列

# -*- coding: utf-8 -*- 
# 1. added above line 
import re 

def findphone(numbers): 
    numregex = re.compile(r'(\(\d\)\d\d\s\d+)') # 2. Added circular brackets around the regular expression 
    numregex1 = re.compile(r'(\(0\)11 123456)') # 3. Escaped circular brackets around 0 

    # 4. Made small changes to the following, mainly changing brackets. 
    phoneRegex = re.compile(r''' 
    (\+\d{3})     # area code 
    [\s|-|\.]      # separator 
    (\d{3}|\(\d\)\d\d)?   # area code 
    [\s|-|\.]      # separator 
    (\d{6})       # Landline Number 
    ''', re.VERBOSE) 
    mo = numregex.search(numbers) 
    mo0 = numregex1.search(numbers) 
    mo1 = phoneRegex.search(numbers) 
    if mo: 
     print('mo ' +str(mo.groups())) 
    if mo0: 
     print('mo0 ' +str(mo0.groups())) 
    if mo1: 
     # 5. break down in separate variables 
     country_code = mo1.groups()[0] 
     area_code = mo1.groups()[1] 
     landline = mo1.groups()[2] 
     print country_code, area_code, landline 

print('Input check text') 
findphone("‌Dr. Someone Spam\nRoom: BLD-2001\n+353 (0)11 123456") 
+0

切换到一个字符类是好的,但要摆脱管道:'[\ s .-]'。另外,您可以使用'group()'返回整个匹配,并且可以使用group(1),group(2)等来返回组。更加整洁,你正在用'groups()'做什么。 –

+0

谢谢Alan,我感谢你所做的编辑的帮助和详细分解,对像我这样的初学者有着巨大的帮助! – David