2011-04-21 100 views
0

我试图在文件中读取,每发现一次, year都会将其打印出来。例如,如果它发现, 2003它将打印出来,但如果它发现,2003它将忽略它。我最初使用了一个拆分,并能够得到一年的匹配,但是当我加入,时,我意识到它看起来像两个不同的单词,所以我不认为这会起作用。查找逗号空间年,但忽略无空格逗号年

这里是我的代码:

import string 
import re 

while True: 
    filename=raw_input('Enter a file name: ') 
    if filename == 'exit': 
     break 
    try: 
     file = open(filename, 'r') 
     text=file.read() 
     file.close() 
    except: 
     print('file does not exist') 
    else: 
     p=re.compile('^\,\s(19|20)\d\d$')//this is my regular expression 
     print(text) 
     m=p.search(text) 
     if m: 
       print(m.groups()) 
+0

这是一个问题?为什么不使用扫描仪发生器? – Marcin 2011-04-21 23:06:49

+0

是的,我有点卡在做什么。你能解释一个扫描器生成器我是新的python – Aaron 2011-04-21 23:11:49

+0

它可能有助于显示一些示例输入。在任何情况下,扫描仪发生器都是一般的计算机科学概念。尝试使用Google搜索:http://www.google.com/search?q=scanner+generator+for+python – Marcin 2011-04-21 23:15:36

回答

1
  1. 如果你想在文件中搜索正则表达式,而不是匹配整个文件的内容,从正则表达式中删除^$

  2. 如果您希望每个文件有多个匹配项,请使用finditerfindall而不是search

  3. 指定使用正则表达式时原始字符串:p=re.compile(r',\s(19|20)\d\d')

例子:

for m in re.finditer(r',\s((19|20)\d\d)', text): 
    print m.group(1) 
0

如果您只需添加一个*\s在你的正则表达式,我认为它应该工作。这将使它匹配零个或多个空白字符,而不是一个。如果您只希望它匹配零个或一个,请改为添加+

1
>>> import re 
>>> text = "foo bar, 2003, 2006,1923, derp" 
>>> p = re.compile(r',\s((?:19|20)\d\d)') 
>>> p.findall(text) 
['2003', '2006'] 

简化示例。首先,删除锚点(^$)并使用findall而不是search查找所有匹配项。我还使用?:来指定一个不匹配的组(它不会显示在结果中),而是将该年设为一个组。